SpringBoot实现配置文件加密的方案分享
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)
相关文章
Mybatis-Plus支持GBase8s分页查询的实现示例
本文主要介绍了使 Mybatis-Plus 支持 GBase8s 的分页查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-01-01详解JAVA中ListIterator和Iterator的辨析
这篇文章主要为大家详细介绍了JAVAListIterator和Iterator的辨析,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助2022-02-02如何使用Spring integration在Springboot中集成Mqtt详解
MQTT是多个客户端通过一个中央服务器传递信息的多对多协议,能高效地将信息分发给一个或多个订阅者,下面这篇文章主要给大家介绍了关于如何使用Spring integration在Springboot中集成Mqtt的相关资料,需要的朋友可以参考下2023-02-02SpringBoot详细讲解如何创建及刷新Spring容器bean
前面看spring源码时可以发现refresh()方法十分重要。在这个方法中会加载beanDefinition,同时创建bean对象。那么在springboot中有没有使用这个refresh()方法呢2022-06-06
最新评论