使用背景:
Springboot项目中的配置文件,涉及到像数据库连接,账号,密码,redis连接,第三方接口连接信息是直接暴露出来的,这给我们项目安全带来一定的安全隐患,为了提高我们项目抵御外来风险的冲击,有必要对项目配置中涉及到隐私的部分进行加密处理。
使用技术:jasypt
具体实现:
1、项目中引入jasypt相关jar
<!--数据库加密工具引用jar-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.3</version>
</dependency>
这里插句题外话,网上很多教程说使用以下版本
jasypt-spring-boot-starter 3.0.3
会方便很多,在我这里没发觉,可能跟我的springboot版本有关吧,我的springboot是2.1.1.
jasypt:
encryptor:
password: 123456
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
上面的password为加密的密钥,开发时可写在application.yml里边,打包部署到线上时务必去掉,否则会导致黑客拿到的密钥和密文进行破解,失去咱们使用jasypt的初衷和良好出发点。
2、在单元测试中对数据库url,username,password等敏感属性进行加密:
@Test
public void getJasypt(){
String url=stringEncryptor.encrypt("jdbc:mysql://127.0.0.1:3306/pcyui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
String username=stringEncryptor.encrypt("root");
String password=stringEncryptor.encrypt("root");
String redisPassword=stringEncryptor.encrypt("123456");
String deURL=stringEncryptor.decrypt(url);
String deUserName=stringEncryptor.decrypt(username);
String depwd=stringEncryptor.decrypt(password);
String deRedisP=stringEncryptor.decrypt(redisPassword);
log.info("加密后url:"+url);
log.info("加密后username:"+username);
log.info("加密后password:"+password);
log.info("加密后redisPassword:"+redisPassword);
log.info("解密后url:"+deURL);
log.info("解密后username:"+deUserName);
log.info("解密后depwd:"+depwd);
log.info("解密后deRedisP:"+deRedisP);
}
3、使用生成的密钥替换配置文件中明文,注意加上ENC()
url: ENC(Y8378foffglgs;s/s;spqgfs==) #这个中间省略很大部分,事实上加密后的密文很长
driver-class-name: com.mysql.cj.jdbc.Driver
username: ENC(KBafrsfaklfdfafg==)
password: ENC(0gkjfweqlspwesklf=)
4、替换好后,将上面的
jasypt: encryptor: password:
password中的密钥去掉,然后打包。将密钥放在启动命令中作为参数启动,提高安全性,启动命令参考如下:
java -jar -Djasypt.encryptor.password=123456 Whcal.jar
上面的Whcal.jar为打包好后输出的jar。
在实际开发中,本地调试可以将密钥配置在这里,依次在IDEA中点击Run-->Edit Configurations-->
在Override parameters 下面的key输入jasypt.encryptor.password,Value则输入自己的密钥,保存。这样在配置文件中就不需要写密钥了。
这里需要注意的是,如果有多个环境,如开发、测试、生产环境,不同环境的配置,原始的敏感数据需要使用明文,原来加密的,先统一恢复为明文,即未加密的,使用单元测试生成后再整体替换掉原来的明文。笔者就吃过这样的亏,不同环境的相互套用,结果,单元测试都报错,无法生成密文。