jasypt原理
- 一、背景知识
- 二、原理分析
- 1、(uml中蓝色)加载Encryptor、Detector和Resolver
- 2、(uml中红色)加载EnableEncryptablePropertiesBeanFactoryPostProcessor
- 3、(uml中绿色)解密过程
以jasypt 1.14为例
一、背景知识
需要了解spring的加载顺序:
- step1:主要是了解
@EnableAutoConfiguration
注解,这个注解的核心是AutoConfigurationImportSelector
- step2:AutoConfigurationImportSelector会读取所有spring.factories文件,
- step3:读取到jasypt-springboot-starter.jar中的spring.factories时,会走动加载
JasyptSpringBootAutoConfiguration
二、原理分析
JasyptSpringBootAutoConfiguration
的UML图如下
1、(uml中蓝色)加载Encryptor、Detector和Resolver
-
EncryptablePropertyDetector encryptablePropertyDetector()
初始化DefaultLazyPropertyDetector,校验是否需要解密(存在ENC(
开头,)
结尾的value)
StringEncryptor stringEncryptor() -
初始化DefaultLazyEncryptor,加载了加密相关参数,(
jasypt.encryptor.password
加密密钥,jasypt.encryptor.algorithm
加密算法)
-
EncryptablePropertyResolver encryptablePropertyResolver()
初始化DefaultLazyPropertyResolver,将密文进行解析
2、(uml中红色)加载EnableEncryptablePropertiesBeanFactoryPostProcessor
- 重写Ordered.getOrder()
- 指定初始化顺序(order最大,初始化完成后执行,最后进行解密)
- 重写BeanFactoryPostProcessor.postProcessBeanFactory()
- 获取所有propertySources
- 过滤出所有不是EncrytablePropertySource
- postProcessBeanFactory()调用makeEncryptable()
- PROXY和WRAPPER
- PROXY:代理模式
properties中设置jasypt.encryptor.proxyPropertySources=true
后才会走代理 - 会增加一个拦截器,加载PropertySource时,会检查是否被加密
- PROXY:代理模式
- WRAPPER:包装器模式
- 默认,创建一个新的 PropertySource 对象来包装原有的对象
- PROXY和WRAPPER
- instantiatePropertySource()将经过jasypt配置的propertySources,替换成EncryptablePropertySource ,使propertySources具有解密能力
3、(uml中绿色)解密过程
读取属性值的时候,就是将原本spring中的propertySource的getProperty()方法委托给EncryptablePropertySource
,getProperty()判断是否是已经加密的value,如果是,则进行解密。如果不是,那就返回原值。
解密代码如下: