一章简单介绍了 SpringBoot整合企业微信消息推送(四十五), 如果没有看过,请观看上一章

一. 配置文件敏感信息加密

我们以前在编写 application.yml 文件时,服务器的ip, 数据库的配置,Redis的密码配置等都是明文,这是很不安全的。

SpringBoot配置文件敏感信息加密(四十六)_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>

默认配置属性是:

SpringBoot配置文件敏感信息加密(四十六)_redis_02

二.二 application.yml 指定配置加密的密码

# 配置文件加密解密
jasypt:
  encryptor:
    password: 123456

SpringBoot配置文件敏感信息加密(四十六)_敏感信息加密_03

目前还是明文

二.三 生成敏感信息的密文

/**
 * 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);

    }
}

SpringBoot配置文件敏感信息加密(四十六)_System_04

可以正常的解析

二.四 配置文件中对敏感信息进行替换

使用 ENC() 方法 将密文包裹

SpringBoot配置文件敏感信息加密(四十六)_System_05

二.五 验证

SpringBoot配置文件敏感信息加密(四十六)_配置文件敏感信息加密_06

发现根本就不行, 解析不了. 这是因为采用的规则方式与系统中规则方式不一致的原因.

默认使用的是 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);

    }

重新生成 加密信息:

SpringBoot配置文件敏感信息加密(四十六)_jasypt_07

配置到 application.yml 文件里面

SpringBoot配置文件敏感信息加密(四十六)_敏感信息加密_08

运行通过

SpringBoot配置文件敏感信息加密(四十六)_redis_09

三. 配置密码处理

虽然将数据库,redis 等敏感信息进行了加密,但同时却将 jasypt 的密码 123456 曝露了出来, 这样也会造成不安全.

可以在启动中进行配置

-Djasypt.encryptor.password=123456

SpringBoot配置文件敏感信息加密(四十六)_redis_10

但最好是使用自定义的配置 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

三.三 测试验证

SpringBoot配置文件敏感信息加密(四十六)_配置文件敏感信息加密_11