一章简单介绍了 SpringBoot整合企业微信消息推送(四十五), 如果没有看过,请观看上一章
一. 配置文件敏感信息加密
我们以前在编写 application.yml 文件时,服务器的ip, 数据库的配置,Redis的密码配置等都是明文,这是很不安全的。
我们可以通过 jasypt-spring-boot-starter 插件进行配置文件敏感信息加密。
本章节所使用的代码是: SpringBoot整合Redis(十九)
本章节参考链接: springboot 配置参数加密——jasypt
二.配置文件敏感信息加密步骤
二.一 添加依赖
<!--配置文件加密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
默认配置属性是:
二.二 application.yml 指定配置加密的密码
# 配置文件加密解密
jasypt:
encryptor:
password: 123456
目前还是明文
二.三 生成敏感信息的密文
/**
* jasypt 生成
*
* @author yuejianli
* @date 2023-05-17
*/
@Log4j2
public class JasyptTest {
@Test
public void showText() {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的salt
textEncryptor.setPassword("123456");
//要加密的数据(数据库的用户名或密码)
String username = textEncryptor.encrypt("root");
String password = textEncryptor.encrypt("Zkong_1234");
String redisPassword = textEncryptor.encrypt("zk123");
System.out.println("username:"+username);
System.out.println("password:"+password);
System.out.println("redisPassword:"+redisPassword);
String originUsername = textEncryptor.decrypt(username);
String originPassword = textEncryptor.decrypt(password);
String originRedisPassword = textEncryptor.decrypt(redisPassword);
System.out.println("originUsername:"+originUsername);
System.out.println("originPassword:"+originPassword);
System.out.println("originRedisPassword:"+originRedisPassword);
}
}
可以正常的解析
二.四 配置文件中对敏感信息进行替换
使用 ENC() 方法 将密文包裹
二.五 验证
发现根本就不行, 解析不了. 这是因为采用的规则方式与系统中规则方式不一致的原因.
默认使用的是 lazyJasyptStringEncryptor,而测试使用的是 BasicTextEncryptor对象。
@Test
public void show2Text() {
PooledPBEStringEncryptor textEncryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("123456");
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
textEncryptor.setConfig(config);
//要加密的数据(数据库的用户名或密码)
String username = textEncryptor.encrypt("root");
String password = textEncryptor.encrypt("Zkong_1234");
String redisPassword = textEncryptor.encrypt("zk123");
System.out.println("username:"+username);
System.out.println("password:"+password);
System.out.println("redisPassword:"+redisPassword);
String originUsername = textEncryptor.decrypt(username);
String originPassword = textEncryptor.decrypt(password);
String originRedisPassword = textEncryptor.decrypt(redisPassword);
System.out.println("originUsername:"+originUsername);
System.out.println("originPassword:"+originPassword);
System.out.println("originRedisPassword:"+originRedisPassword);
}
重新生成 加密信息:
配置到 application.yml 文件里面
运行通过
三. 配置密码处理
虽然将数据库,redis 等敏感信息进行了加密,但同时却将 jasypt 的密码 123456 曝露了出来, 这样也会造成不安全.
可以在启动中进行配置
-Djasypt.encryptor.password=123456
但最好是使用自定义的配置 bean 进行处理。
三.一 创建 自定义的 Bean
/**
* @Description 配置加密文件
* @Author yuejianli
* @Date 2022/6/5 6:43
**/
@Component
public class MyJasyptConfig {
@Bean(name = "CodeEncrypBean")
public StringEncryptor CodeEncrypBean() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("123456");
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
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);
return encryptor;
}
}
三.二 application.yml 设置 Bean
# 配置文件加密解密
jasypt:
encryptor:
# 去掉 password 配置
bean: CodeEncrypBean