SpringBoot集成jasypt对配置文件中重要的属性加密
背景
在系统的使用时,配置文件中一些重要的信息为了安全,需要对其进行加密保存,比如数据库密码不能使用明文保存在配置文件,需要进行加密之后再保存。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.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,备份原来的文件,替换成下载的压缩包中的文件。
也可以通过这个mvn插件解密,执行如下命令,可以在控制台看到解密之后的明文。
mvn jasypt:decrypt-value -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("PBEWITHHMACSHA512ANDAES_256"); 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: ")"