1.为什么要对配置文件关键信息进行加密?
yaml
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中引入如下依赖
xml
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
1.2 对敏感数据生成加密字符串
有以下三种加密方式,请根据自己需求和项目情况自行选择:
方式1: 通过加密工具类生成(以下为代码实例,可以直接使用)
arduino
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包,通过命令行的模式获取(不推荐,操作起来不够方便)
bash
java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password="test" algorithm=PBEWithMD5AndDES input=root
输出结果:
----ENVIRONMENT-----------------
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插件
xml
<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标签中的路径请根据自己配置文件路径配置
修改配置文件
yaml
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加密命令
ini
mvn jasypt:encrypt -Djasypt.encryptor.password=test
执行完该命令之后,DEC中的内容会自动被替换为ENC(加密内容)
Maven解密命令
ini
mvn jasypt:decrypt -Djasypt.encryptor.password=test
1.3 使用
配置文件中按下图添加密钥和需要加密的属性之后,启动时会自动对敏感数据进行解密
yaml
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 安全事项
由于该方案采用的是对称加密,一旦泄露密钥,相关密码将暴露,将密钥配置在配置文件中,非常不安全,推荐将密钥添加到启动命令中,降低暴露风险
ini
java -jar demo.jar --Djasypt.encryptor.password=test