背景
在系统的使用时,配置文件中一些重要的信息为了安全,需要对其进行加密保存,比如数据库密码不能使用明文保存在配置文件,需要进行加密之后再保存。SpringBoot可以使用jasypt来为重要的配置属性提供加解密的支持。
spring-boot集成jasypt
SpringBoot项目,直接通过引入jasypt-spring-boot-starter,jasypt使用与自己SpringBoot项目对应的版本
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
添加一个maven的插件,这个插件可以帮助我们加密我们需要的明文信息。
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.3</version>
</plugin>
然后执行mvn命令,可以在控制台得到对应的密文。将配置文件中明文替换为加密后的密文。
mvn jasypt:encrypt-value -Djasypt.encryptor.algorithm=PBEWithMD5AndDES -Djasypt.encryptor.password=yuorPassword -Djasypt.plugin.value=root
-Djasypt.encryptor.password:类似于加密的密钥
-Djasypt.plugin.value:需要加密的明文参数。
执行命令后,在控制台可以看到加密后的密文,密文默认是用ENC()格式包围住的,这个格式也可以自定义。
注意:使用默认的JDK8时可能会出现JCE的问题:Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy,原因是Java密码术扩展(JCE)无限强度管辖权策略,
解决办法一:
https://www.oracle.com/technetwork/cn/java/javase/downloads/jce8-download-2133166-zhs.html
去官网下载JCE压缩包,找到jre下的security的目录:%JAVA_HOME%\jre\lib\security,备份原来的文件,替换成下载的压缩包中的文件。
解决办法二:
修改默认算法Algorithm=PBEWithMD5AndDES
也可以通过这个mvn插件解密,执行如下命令,可以在控制台看到解密之后的明文。
mvn jasypt:decrypt-value -Djasypt.encryptor.algorithm=PBEWithMD5AndDES -Djasypt.encryptor.password=yuorPassword -Djasypt.plugin.value=ENC(20IDlU5b4uyj3QTp4dH6fMEbH53B+LW9hhYfe3z4y/8glojojnA0d72JNZBTEaRP)
在项目配置文件中,把刚刚加密得到的密文替换原明文即可。
为了完全,把jasypt的password和配置文件中的密文分开保存
@Bean("jasyptStringEncryptor")
public StringEncryptor jasyptStringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("yuorPassword");
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
其中参数可参照加密明文时打印的日志信息。
最后说一下自定义解密前后缀,在配置文件中添加以下配置,以yaml为例
jasypt:
encryptor:
property:
prefix: "ENC@("
suffix: ")"