1.jasypt简介和为什么要对配置文件进行加密
1.1 jasypt 简介
Jasypt 是一个 Java 库,它允许开发人员以最小的努力为项目添加基本的加密功能,而无需深入了解密码学的工作原理。
1.2 为什么要对配置文件进行加密
先看一份典型的配置文件
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=CTT&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: 127.0.0.1
port: 6379
password: 123456
...
像这样将项目的数据库密码、redis密码等直接写在项目中会有潜在的风险,比如项目源码泄漏,员工一不小心将公司源码上传到公有仓库,导致公司数据库密码泄漏。这时候对配置文件的关键信息进行加密就变得非常有必要了。
2.Jasypt加密场景及对应的工具类加密算法
3.SpringBoot3 整合 jasypt
3.1 引入依赖
- 用的springboot3.0.8版本
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
3.2 生成加密字符串
- PBEWITHHMACSHA512ANDAES_256 算法
@Test
public void testJasypt() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
// 加密方式
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
// 盐值
config.setPassword("jupiter");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
String username = encryptor.encrypt("root");
String password = encryptor.encrypt("123456");
System.out.println("username:" + username);
System.out.println("password:" + password);
username = encryptor.decrypt(username);
password = encryptor.decrypt(password);
System.out.println("username:" + username);
System.out.println("password:" + password);
}
username:o+GwMZViEUGlI9IrXRQ4Osyyue2xt/XdNWZZv/WNUXa1evDd1aBLR+jWqtKiuJ6n
password:8mpyKrDyXMUi/iTNjWBDy1JhY5LKqdkhwza6NowBmjx3BP6NX7Z1mm7/ZAtCrV6U
username:root
password:123456
3.3 写入配置文件并读取测试
- application.yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=CTT&useSSL=false&allowPublicKeyRetrieval=true
username: ENC(o+GwMZViEUGlI9IrXRQ4Osyyue2xt/XdNWZZv/WNUXa1evDd1aBLR+jWqtKiuJ6n)
password: ENC(8mpyKrDyXMUi/iTNjWBDy1JhY5LKqdkhwza6NowBmjx3BP6NX7Z1mm7/ZAtCrV6U)
jasypt:
encryptor:
password: jupiter
algorithm: PBEWithHmacSHA512AndAES_256
- 读取测试
$\color{red}{注意:springboot类上要加@EnableEncryptableProperties注解,否则不会进行自动解密!!!}$
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Test
public void testReadENCText() {
System.out.println("username=" + username + ",password=" + password);
}
username=root,password=123456
3.4 线上使用注意事项
回到开头,我们加密配置项的目的是为了防止在配置文件泄漏的时候,把配置信息一起泄漏出去。配置我们是加密了,但密钥还是保存在配置文件中,别人还是能拿到密钥在解密出配置信息,这就相当于我们把门给锁了,但是钥匙还是插在锁上,所以需要将配置跟密钥分开存储。推荐采用环境变量的方式:
#!/bin/bash
export ENCRYPTOR_PASSWORD=jupiter
java -jar -Djasypt.encryptor.password=$ENCRYPTOR_PASSWORD
$\color{red}{注意:设置环境变量后解密会加载环境变量中设置的值,即使在配置文件中写了也会不生效被覆盖掉!!!!}$
评论 (0)