SpringBoot实现配置文件加密的方案分享
作者:Rise同志
1.为什么要对配置文件关键信息进行加密
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false username: root password: root redis: host: 127.0.0.1 port: 6379 password: 123456
项目的数据库密码、redis 密码等明文展示在配置文件中会有潜在的风险,比如源码泄露,或者配置文件暴露,会导致相关密码泄露,造成安全风险,因此采用合适的安全防护措施是有必要的。
2.配置文件加密方案
方案1:jasypt
jasypt 是一个开源的工具类,可以方便的对 SpringBoot 配置文件中的配置项进行对称加密
集成步骤
1.1 引入Jar包
在maven中引入如下依赖
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
1.2 对敏感数据生成加密字符串
有以下三种加密方式,请根据自己需求和项目情况自行选择:
方式1: 通过加密工具类生成(以下为代码实例,可以直接使用)
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig; /** * 使用Jasypt对配置文件进行加密 */ public class JasyptUtil { /** * 加密算法 加密解密保证同一种算法 * jasypt3.0后,默认支持的算法为 PBEWITHHMACSHA512ANDAES_256,这种算法安全性更高,但是需要 Java JDK 1.9+或添加JCE(Java Cryptography Extension 无限强度权限策略文件) * 使用PBEWithMD5AndDES算法即可 */ private static final String algorithm ="PBEWithMD5AndDES"; //密钥,对称加密使用同一个密钥进行加解密,密钥自己定义,注意保管 private static final String key ="test"; public static void main(String[] args) { //加密方法示例 String encryptInfo = encrypt("root"); System.out.println(encryptInfo); //解密方法示例 String decryptInfo = decrypt(encryptInfo); System.out.println(decryptInfo); } /** * 加密 * * @param value 明文 * @return */ public static String encrypt(String value) { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); // 指定算法 config.setAlgorithm(algorithm); // 指定秘钥 config.setPassword(key); encryptor.setConfig(config); // 加密数据 return encryptor.encrypt(value); } /** * 解密 * * @param value 密文 * @return */ public static String decrypt(String value) { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); config.setAlgorithm(algorithm); config.setPassword(key); encryptor.setConfig(config); // 解密数据 return encryptor.decrypt(value); } }
方式2: 执行 jar包,通过命令行的模式获取(不推荐,操作起来不够方便)
java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password="test" algorithm=PBEWithMD5AndDES input=root
输出结果:
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.161-b12
----ARGUMENTS-------------------
input: root
algorithm: PBEWithMD5AndDES
password: ADUMDFUOV7834*
----OUTPUT----------------------
dXTlEeOApsY5oCeCQEo4Gg==
注:
- password:用来加密的密钥
- algorithm:加密算法 PBEWithMD5AndDES/PBEWITHHMACSHA512ANDAES_256。使用PBEWithMD5AndDES即可
- input:后接的属性为需要加密的参数
- OUTPUT输出的值即为加密后的值
方式三: 使用Maven插件(推荐,使用起来比较快捷)
Maven中引入jasypt插件
<plugin> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-maven-plugin</artifactId> <version>3.0.3</version> <configuration> <path>file:src/main/resources/application.yml</path> </configuration> </plugin>
注:
path标签中的路径请根据自己配置文件路径配置
修改配置文件
server: port: 8030 spring: datasource: url: jdbc:mysql://localhost:3306/test?useSSL=false driver-class-name: com.mysql.jdbc.Driver username: DEC(root) password: DEC(root) jasypt: encryptor: password: test
- 需要加密的数据使用DEC()包起来
- password为密钥自定义
Maven加密命令
mvn jasypt:encrypt -Djasypt.encryptor.password=test
执行完该命令之后,DEC中的内容会自动被替换为ENC(加密内容)
Maven解密命令
mvn jasypt:decrypt -Djasypt.encryptor.password=test
1.3 使用
配置文件中按下图添加密钥和需要加密的属性之后,启动时会自动对敏感数据进行解密
spring: datasource: url: jdbc:mysql://localhost:3306/test?useSSL=false driver-class-name: com.mysql.jdbc.Driver username: ENC(加密之后的属性) password: ENC(加密之后的属性) jasypt: encryptor: password: 自定义的密钥
1.4 安全事项
由于该方案采用的是对称加密,一旦泄露密钥,相关密码将暴露,将密钥配置在配置文件中,非常不安全,推荐将密钥添加到启动命令中,降低暴露风险
java -jar demo.jar --Djasypt.encryptor.password=test
以上就是SpringBoot实现配置文件加密的方案分享的详细内容,更多关于SpringBoot配置文件加密的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
- SpringBoot使用Jasypt对配置文件和数据库密码加密
- springboot中非容器类如何获取配置文件数据
- 详解SpringBoot依赖注入和使用配置文件
- SpringBoot如何从配置文件中读取配置参数
- SpringBoot中的配置文件加载优先级详解
- Springboot如何实现对配置文件中的明文密码加密
- SpringBoot中的YAML配置文件和日志详解
- SpringBoot绑定配置文件中变量的四种方式总结
- SpringBoot读取多环境配置文件的几种方式
- SpringBoot中获取配置文件的注解详解
- Spring Boot 配置文件(application.yml、application-dev.yml、application-test.yml)