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:1234563.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=1234563.4 线上使用注意事项
回到开头,我们加密配置项的目的是为了防止在配置文件泄漏的时候,把配置信息一起泄漏出去。配置我们是加密了,但密钥还是保存在配置文件中,别人还是能拿到密钥在解密出配置信息,这就相当于我们把门给锁了,但是钥匙还是插在锁上,所以需要将配置跟密钥分开存储。推荐采用环境变量的方式:
#!/bin/bash
export ENCRYPTOR_PASSWORD=jupiter
java -jar -Djasypt.encryptor.password=$ENCRYPTOR_PASSWORD$\color{red}{注意:设置环境变量后解密会加载环境变量中设置的值,即使在配置文件中写了也会不生效被覆盖掉!!!!}$
    
评论 (0)