SpringBoot 整合 jasypt 对配置项进行加密

jupiter
2023-08-24 / 0 评论 / 41 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年08月24日,已超过252天没有更新,若内容或图片失效,请留言反馈。

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}{注意:设置环境变量后解密会加载环境变量中设置的值,即使在配置文件中写了也会不生效被覆盖掉!!!!}$

参考资料

  1. Jasypt加密工具整合SpringBoot使用 - 简书 (jianshu.com)
  2. SpringBoot 使用 jasypt 对配置项进行加密 - 掘金 (juejin.cn)
  3. jasypt 加解密的各个版本支持,看这一篇文章就够了_jasypt 3.0.3_Ramboooooooo的博客-CSDN博客
  4. Spring Boot Jasypt 3.0.4 报错---算法加解密使用不一致_pbewithhmacsha512andaes_256_神韵499的博客-CSDN博客
0

评论 (0)

打卡
取消