1、需求
对于一些配置文件里的敏感信息,如数据库密码、部分对接的账号密码之类的数据,进行加密存储。不让密码明文暴露在配置文件中。
2、springboot项目集成 jasypt的三种使用方式
MD5密码加密,非对称RSA公钥加密私钥解密,自定义算法加解密
2.1、引入相关依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
2.2、是否需要在启动类添加注解
一般springboot项目的启动类都有@SpringBootApplication 所以也包含了@EnableAutoConfiguration
所以使用jasypt只需要引入依赖,然后在配置文件中配置加密的密码,即可以在项目启动时对密文进行解密。
详情看官方文档 https://github.com/ulisesbocchio/jasypt-spring-boot/blob/master/README.md
2.3、配置文件配置加密密码
jasypt:
encryptor:
password: abcqwe
algorithm: PBEWithMD5AndDES
2.4、生成密文示例代码
public static void main(String[] args) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的salt(盐)
textEncryptor.setPassword("abcqwe");
//要加密的数据(数据库的用户名或密码)
String username = textEncryptor.encrypt("root");
String password = textEncryptor.encrypt("root123");
System.out.println("username:"+username);
System.out.println("password:"+password);
}
生成代码后,替换掉配置文件的明文数据,用ENC(newpassword)的形式即可。
当然也不一定是用ENC()包裹密文,可以自定义前缀后缀,例如:
password: ENC(jdiakjd3wq89awdak13joiawdqwji)
这种是最简单的,安全性也是最低的,拿到配置文件和加密密码后调用textEncryptor.decrypt就可以解密得到明文密码。
所以一般使用这个的话会把密码设置到启动参数。不过也是感觉不太好用,稍微升级一下的话就用非对称加密。
2.5、非对称加密
配置文件改成
jasypt:
encryptor:
privateKeyFormat: PEM
privateKeyString: asidjqkwjoikqjojwqopdjqopjwdpoqkpoldkqwpoeikpqowieopqiwepoqiwpoe
默认是用公钥加密,然后配置的私钥解密,所以对应的密文就需要用公钥加密后存储。
这种方式比MD5的好一点,也差不多,也是公开的算法加密。
2.6、 自定义加密类
修改配置文件,配置好加解密的算法实现类
jasypt:
encryptor:
bean: customStringEncryptor
然后创建一个bean customStringEncryptor实现StringEncryptor接口,重写加解密方法
比如简单的在密文后加111,然后解密就把最后的111去掉,实际使用就随意发挥了,可以多重加密解密
import org.jasypt.encryption.StringEncryptor;
import org.springframework.stereotype.Component;
/**
* @author : itmamba
* @version 1.0
* @date : 2021/6/10 21:59
*/
@Component("customStringEncryptor")
public class CustomStringEncryptor implements StringEncryptor {
@Override
public String encrypt(final String message) {
return message+"111";
}
@Override
public String decrypt(final String encryptedMessage) {
return encryptedMessage.substring(0,encryptedMessage.indexOf("111"));
}
}
3、jasypt 实现原理以及源码浅读分析
源码地址:https://github.com/ulisesbocchio/jasypt-spring-boot
集成jasypt后启动项目首先可以看到一个Converter转换器 EncryptablePropertySourceConverter
这个作用就是 将environment的PropertySource转换成EncryptablePropertySource
这样就可以对配置文件中的密文进行解密
这个工具组件有四个比较关键的类可以自定义使用:Filter、Resolver、Detector、StringEncryptor
上述用到的自定义加解密算法就是实现StringEncryptor接口。其他的需要自定义前后缀之类的可以参考官方文档使用。
不自定义实现的话也会默认加载一些 lazy 开头的实现类。例如 lazyEncryptablePropertyFilter、lazyEncryptablePropertyDetector等。
lazyEncryptablePropertyDetector 作用就是过滤出需要解密的配置,然后去掉前后缀,再进行解密。
例如redis和datasource设置连接属性时就是在JavaBeanBinder的bind方法里,对RedisProperties 和 DatasourceProperties setValue时,设置了解密后的明文。
4、注意事项及常见问题
注意事项:使用时最好对比下版本,不同的springboot版本使用合适的jasypt版本。
遇到问题:项目启动正常,但是进行数据库访问时报异常。
原因:Hikari 连接池在springboot2.1.5前有默认创建连接,之后好像是没有的,可以关注启动时的日志,看启动时有没打印hikari starting
即兴记录部分,接入项目还有问题未解决...
解决完再详细续写...
未完待续....