Spring整合jasypt原理分析
前言
在我们系统中,有很多敏感数据,如 MySQL 及 Redis 的账号密码信息等,jasypt 可以帮我们加密这些信息,使系统更加的安全。
使用
添加 maven 依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
添加配置
application.yml
jasypt:
encryptor:
password: pwd123
spring:
rabbitmq:
host: xxx # RabbitMQ 服务的地址
port: 5672 # RabbitMQ 服务的端口
username: admin # RabbitMQ 服务的账号
password: ENC(TKt6b0Ll3t39h9upZ32ntw==) # RabbitMQ 服务的密码
listener:
simple:
acknowledge-mode: manual
publisher-returns: true
publisher-confirm-type: correlated
手动创建加密信息
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
public class TestJasypt {
public static void main(String[] args) {
testEncrypt();
}
private static void testEncrypt(){
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("pwd123");
config.setPoolSize(1);
encryptor.setConfig(config);
String encryptStr = encryptor.encrypt("szz123"); // 对 RabbitMQ 密码加密
System.out.println(encryptStr);
}
}
原理分析
- JasyptSpringBootAutoConfiguration 配置类会导入 EnableEncryptablePropertiesConfiguration。
- EnableEncryptablePropertiesConfiguration 又会导入 EncryptablePropertyResolverConfiguration 及 EnableEncryptablePropertiesBeanFactoryPostProcessor。
- EncryptablePropertyResolverConfiguration 配置类中的 DefaultLazyPropertyDetector 用来判断一个属性值是否为加密字符串,默认为以 ENC( 开头,以 ) 结尾,DefaultLazyEncryptor 用来解密。
- EnableEncryptablePropertiesBeanFactoryPostProcessor 后置处理器用来将加密字符串解密为原来的信息,将原来的 PropertySource 转换为 EncryptablePropertySourceWrapper,在被调用 getProperty(name) 方法时才解密,延迟处理。
- 最终的解密处理类为 DefaultPropertyResolver,调用 DefaultPropertyDetector 来判断一个属性值是否需要解密,调用 DefaultLazyEncryptor 来解密。
- 底层使用 PooledPBEStringEncryptor 来加解密。
参考
【Springboot】Springboot整合Jasypt,让配置信息安全最优雅方便的方式
【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?