jasypt的基本原理

article/2025/10/9 0:21:31

文章目录

    • 一、jasypt的启动类加载
    • 二、 jasypt中Encryptor、Detector和Resolver加载
    • 三、jasypt中EnableEncryptablePropertiesBeanFactoryPostProcesso
    • 四、proxy代理方式增强propertySources
    • 五、wrapper包装类方式增强propertySources
    • 六、resolver中属性值解密

作者:史佳健
推荐理由:文章详尽并有对应分析说明

一、jasypt的启动类加载

引入了jasypt-spring-boot-starter的jar包之后,项目启动的时候,是如何加载jasypt的呢? 这利用的是项目启动类上的一个注解@SpringBootApplication,这个注解中引用了@EnableAutoConfiguration注解。

这个注解又引入了继承了AutoConfigurationImportSelector类的EnableAutoConfigurationImportSelector类,在AutoConfigurationImportSelect类中提供了getCandidateConfigurations方法。在该方法中,

从classpath中搜索所有META-INF/spring.factories配置文件。然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器中。这样就实现了在spring boot中加载外部项目的bean或者第三方jar中的bean。

这里jasypt-spring-boot-starter加载的就是类com.ulisesbocchio.jasyptspringboot.JasyptSpringBootAutoConfiguration。

二、 jasypt中Encryptor、Detector和Resolver加载

jasypt-spring-boot-starter中的启动类JasyptSpringBootAutoConfiguration,注解了@Import(EnableEncryptablePropertiesConfiguration.class)。先加载EnableEncryptablePropertiesConfiguration类。

这个类主要是用来加载lazyJasyptStringEncryptor、lazyEncryptablePropertyDetector和lazyEncryptablePropertyResolver。这些类在加载的时候,都是先从bean工厂中获取对应的对象,如果获取不到就创建默认对象。

这样做是为了方便我们扩展,可以自定义Encryptor、Detector和Resolver类。比如自定义StringEncryptor
在这里插入图片描述

三、jasypt中EnableEncryptablePropertiesBeanFactoryPostProcesso

EnableEncryptablePropertiesConfiguration类中,创建了EnableEncryptablePropertiesBeanFactoryPostProcessor对象,这个类实现了BeanFactoryPostProcessor接口、ApplicationListener接口和Ordered接口。

实现了BeanFactoryPostProcessor,重写其中的postProcessBeanFactory方法,可以在容器初始化完成之后执行重写后的postProcessBeanFactory方法,实现Ordered接口,重写其中的getOrder方法,

可以用来指定在多个实现BeanFactoryPostProcessor类中的执行顺序,比如返回Ordered.LOWEST_PRECEDENCE,就是指初始化顺序最低,即最后初始化,也就是说表明在容器初始化完成之后,最后执行该类中的postProcessBeanFactory。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述EnableEncryptablePropertiesBeanFactoryPostProcessor类中,实现BeanFactoryPostProcessor,重写的postProcessBeanFactory方法。 该方法中的主要逻辑就是,获取所有的propertySources。

然后过滤出所有的不是EncrytablePropertySource,然后通过makeEncryptable方propertySource对象法,将所有通过jasypt加密的配置项的propertySources替换成拥有加解密功能的对象。可以通过代理和包装来增强propertySources。

可以通过配置项来指定增强方式。一般默认的是包装类的方式
在这里插入图片描述
在创建EnableEncryptablePropertiesBeanFactoryPostProcessor对象的时候,就通过jasypt.encryptor.proxyPropertySources配置项来指定propertySource的增强方式,默认是wrapper包装类的方式。 可以修改为代理方式。

四、proxy代理方式增强propertySources

在这里插入图片描述上面就是makeEncryptable方法中,通过proxy代理的方式增强propertySources对象,在调用propertySources中的方法的时候,通过EncryptablePropertySourceMethodInterceptor对象中的invoke方法进行代理。

创建EncryptablePropertySourceMethodInterceptor对象的两个入参,第一个就是被代理对象,第二个就是真正执行获取属性getProperty方法的EncryptablePropertyResolver,可以在获取属性的时候,对通过jasypt加密的属性进行解密。
在这里插入图片描述在这里插入图片描述上面就是EncryptablePropertySourceMethodInterceptor对象中的invoke方法。主要是先保证,代理的方法是getProperty方法,然后通过EncryptablePropertySourceMethodInterceptor实现的EncryptablePropertySource接口中的

默认方法 default Object getProperty(EncryptablePropertyResolver resolver, PropertySource source, String name)方法,来获取指定属性解密之后的值。在另外一种增强方式Wrapper包装方式中,最终使用的也是该接口中的这个默认方法。

五、wrapper包装类方式增强propertySources

在这里插入图片描述在这里插入图片描述
上面就是makeEncryptable方法中,通过wrapper包装类增强propertySources的方式。给不同类型的propertySources进行不同的包装。实现增强的方式,主要是通过重写包装类继承PropertySources中的getProperty方法,

在重写的方法中,调用所实现的EncrytablePropertyResoler接口中的那个getProperty默认方法。
在这里插入图片描述EncrytablePropertyResoler接口中的默认方法getProperty。先通过原本的propertySources对象,获取配置文件中加密之后的指定属性的值。先判断是字符串类型的(加密之后一般都是字符串类型的)。

然后通过EncrytablePropertyResolver对象中的resolvePropertyValue方法,将加密的属性值解密。最后返回解密之后的值。

六、resolver中属性值解密

在这里插入图片描述
在这里插入图片描述
上面是默认的DefaultPropertyResolver对象中的resolvePropertyValue方法。在方法中先是通过EncryptablePropertyDetector对象的isEncrypted方法来判断传入的属性值,是否被加密,判断逻辑是该值是否是以配置的前缀和后缀来开头和结尾的。

如果是,那么就认为是加密之后的值。然后再将值截取前缀和后缀,通过StringEncryptor对象的decrypt方法对加密内容解密,最后返回解密之后的值。


http://chatgpt.dhexx.cn/article/yfGD6pZi.shtml

相关文章

Jasypt 开源加密库使用教程

目录 Jasypt 加密概述 Jasypt 快速使用 StringEncryptor 加解密 Jasypt 配置详解 Jasypt 加密概述 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏…

使用jasypt 进行配置文件加密

项目中application.yml 配置文件的各种链接的username,password的值都是明文的,其实存在一定的安全隐患,这是可以使用jasypt 的方式进行明文加密, 需要注意的是 盐值和密文分开保存 参考学习-1 参考学习-2 下面实现最简单的配置 项目是sprin…

Jasypt实现数据加解密(脱敏)

场景一&#xff1a;对配置文件中的裸露的密码进行加密 1、添加依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version></dependency> …

加密组件Jasypt学习、实战及踩坑记录

概述 最近入职新公司&#xff0c;因几乎全部项目都使用到jasypt&#xff0c;故而初步学习记录下本文&#xff08;持续更新&#xff09;。 官网及GitHub给出的简介&#xff1a;使用简单&#xff0c;性能好&#xff0c;特性features非常丰富&#xff1b;支持 另&#xff0c;有个…

Jasypt加解密

Jasypt加密 Jasypt加密引言介绍整合SpringBoot引入依赖编写配置加密和解密通过Java程序获取密文和解密通过jasypt中jar包程序获取密文使用密文&#xff1a;ENC(密文) 异常问题JCE权限问题yml中带有引起的问题 关于盐值&#xff08;密钥&#xff09;配置设置其他 Jasypt加密 引…

微服务SpringBoot整合Jasypt加密工具

文章目录 一、Jasypt介绍二、Jasypt手动使用2.1 密码加密场景2.2 文本加密场景2.3 数值加密场景2.4 二进制数据加密场景 三、Jasypt整合SpringBoot四、生成环境启动无、参考文档 一、Jasypt介绍 Jasypt是Java加密工具包&#xff0c;能支持对密码的哈希加密&#xff0c;对文本和…

Springboot之Jasypt配置文件加密/解密

Jasypt配置文件加密/机密 一、Jasypt介绍二、Springboot整合Jasypt2.1 环境配置2.2 添加依赖2.3 添加Jasypt配置2.4 编写加/解密工具类2.5 修改配置文件2.5 如何进一步防止密码泄露2.5.1 自定义加密器2.5.3 加密盐值通过环境变量指定 文章系列 【一、Springboot之Jasypt配置文…

java中byte与int的转换原理

前些天遇到一个问题&#xff0c;byte[0] "A3"&#xff08;十六进制表示&#xff09; 但是在debug时显示的是 -93 &#xff0c;而如果直接赋值给int的变量也是-93.当然大部分人都知道这是不能直接赋值的&#xff0c;需要以下面的这种方式将byte转换成int&#xff1a;…

Java byte 转化为 String

1、Java 中 byte 转化为 String&#xff0c;代码如下 package nice.com.mian;import java.io.UnsupportedEncodingException;public class StringMain {public static void main(String[] args) throws Exception {byte[] bb {97,99,105,51,55};String str new String(bb, &…

Java byte[] 转 String的简单转换

简单的将byte[] 还原成了 String 值 [TOC] 代码&#xff1a; public class Test0719 {public static void main(String[] args) {String text "test";byte[] textBytes text.getBytes();String content byteToString(textBytes);System.out.println(textBytes &q…

java:int强制类型转换成byte

注&#xff1a;非常感谢评论的最佳戏子大佬指出了我的不足&#xff0c;已经进行修改 int强制类型转换成byte 一、基础知识二、int->byte方法一方法二 一、基础知识 int 在java中是32位&#xff0c; byte是8位 原码&#xff1a;就是二进制码&#xff0c;最高位为符号位&…

C#初级编程

Unity学习笔记——C#初级编程 一、Awake 和 Start二、Update 和 FixedUpdate三、启用和禁用组件四、SetActive、Active Self、Active in Hierarchy五、位置和旋转六、transform.lookAt(Transform target)七、线性插值八、Destroy九、GetButton 和 GetKey十、GetAxis十一、GetCo…

零基础怎样自学编程?新手如何学习编程?编程学习入门指南

对于编程&#xff0c;很多新手的第一感觉可能就是&#xff1a; 高深&#xff0c;难学。 学好编程&#xff0c;有的时候&#xff0c;可以把一些需要我们重复劳动的工作&#xff0c;自动化批量处理&#xff0c;为我们节省很多时间和精力。 对于一些学得比较深入的朋友来说&…

新手学计算机编程怎么入门 从哪学起

近些年有一种职业发展很快、人才需求量大、工资高&#xff0c;那就是程序员。他们的基本工作就是电脑编程&#xff0c;开发者各种各样的软件、APP&#xff0c;被很多人膜拜。如果你想成为一名程序员&#xff0c;有必要了解一下这些基本的电脑编程入门教程。 1计算机编程怎么入门…

代码编程教学入门

前言 代码编程是我们在现代能获得的最宝贵的技能之一&#xff0c;学会写代码不仅让我们在职业前景上更得心应手&#xff0c;而且还能让我们的大脑保持活跃和创造性&#xff0c;甚至我们还有机会创造出一些 awesome 的东西出来。 如果我们才刚刚开始&#xff08;或准备开始&am…

20道经典C语言编程题(初级)

编者按&#xff1a;以下20道题目为自己练习所写的代码&#xff0c;均已提交检测通过&#xff0c;其中有些题也许有更优的解法&#xff0c;所以写的不好望读者包涵&#xff0c;由于个人练习&#xff0c;所以没有写注释&#xff0c;有什么问题的地方&#xff0c;可以留言一起交流…

沈师 PTA 数据库题目及部分解析 第四章

判断题 1.在数据库安全性控制中&#xff0c;所有授予出去的权力在必要时都可以用REVOKE语句收回。 T 2.用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人&#xff0c;因此称这样的存取控制是自主存取控制。 T 3.数据库的安全性是指保护数据…

编程题目+数据库题目总结(3)

目录 编程题1.字典中保存了一些股票代码&#xff08;键&#xff09;及价格&#xff08;值&#xff09;&#xff0c;用一行代码找出价格最高的股票&#xff0c;输出股票代码。(5分&#xff09;2.字典中保存了一些股票代码&#xff08;键&#xff09;及价格&#xff08;值&#x…

沈师 PTA 数据库题目及部分解析 第一章

判断题&#xff1a; 1.一个数据库只有一个模式和一个内模式。 T 2.数据模型是由数据结构、数据操作和完整性约束三部分组成的 T 3.由于数据库中的数据是不断更新的&#xff0c;因此关系模式是相对变化的。 F 解析&#xff1a;关系模式不会相对变化&#xff0c;变化的是实例 4.数…