基于 Jasypt对 Springboot 配置信息进行加密

本文介绍如何使用Jasypt加密库对SpringBoot项目的敏感配置信息进行加密保护,包括配置依赖、手动加密过程、配置文件修改及自定义配置类编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景介绍

Springboot 项目中广泛使用配置文件,对于敏感信息如数据库用户名、密码等,如果采用明文,容易导致数据泄露等问题。为此,可通过专用的加密工具进行加密,工程内部读取后先进行解密再使用。

什么是 Jasypt

Jasypt是一个加密库,支持密码、Digest认证、文本、对象加密。加密算法:

  • PBEWithMD5AndDES,2.1.2版本默认
  • PBEWITHHMACSHA512ANDAES_256,3.0.3版本默认
  • 支持扩展自定义算法

jasypt-spring-boot-starter是整合了 Jasypt 加密功能的 Spring-boot 适配组件,可快速整合到 Springboot 项目中。

Springboot 整合 Jasypt 过程说明

基于 Jasypt 对 Springboot 的配置信息进行加密,主要包括如下步骤。

1、添加 Jasypt 依赖

  <dependency>
      <groupId>com.github.ulisesbocchio</groupId>
      <artifactId>jasypt-spring-boot-starter</artifactId>
      <version>3.0.3</version>
  </dependency>

如果是 Gradle,则:

implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3")

补充一句:如果低于 3.0.3 版本,可能会影响配置中心的使用(有待考证)。

2、手工加密并获取密文

在本地maven库找到org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar,使用java命令执行该 jar 可对明文字符串进行加密,得到密文。
在加密前,需要先明确:加密算法选哪个、密钥用什么。现假设密钥为:“mykey123456789”,加密算法为 PBEWithMD5AndDES,待加密的字符串为“mypass123”,则运行如下命令进行加密,即可获得密文:

java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=mypass123 password=mykey123456789 algorithm=PBEWithMD5AndDES

执行结果的OUTPUT部分即为密文,如下:

----OUTPUT----------------------

z2eGlg9L7eALDDy0OusbpKLvy7T/TIMb

我们可以解密反算一下,看是否与原来的明文一致:

java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input=z2eGlg9L7eALDDy0OusbpKLvy7T/TIMb password=mykey123456789 algorithm=PBEWithMD5AndDES

执行后,可看到结果为:

----OUTPUT----------------------

mypass123

与预期一致。按此方法,逐一对待加密的明文字符串进行加密即可。

3、修改配置文件

现在可以将配置文件中的敏感信息修改为加密后的密文了,直接用 ENC()包裹密文即可。示例如下:

spring:
  datasource:
    password: ENC(z2eGlg9L7eALDDy0OusbpKLvy7T/TIMb)

当然,jasypt 本身可以在配置文件中指明密钥、加密算法等内容,示例如下:

jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD}
    algorithm: PBEWithMD5AndDES
    iv-generator-classname: ...

但是这样一来,等于明确了具体的密钥位置和加密算法。安全隐患仍然存在。为此,可进一步优化:

  • 将加密算法在程序内固定下来,无需通过配置告知
  • 密钥改为环境变量配置,程序运行时加载该环境变量

该优化内容在接下来的第4步实现(非必须的)。

4、编写自定义 Jasypt 配置类

示例如下:

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class EncryptionConfig {
    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(System.getenv("MY_SECRET_KEY"));
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}

程序中指定了从环境变量中读取MY_SECRET_KEY的值作为密钥,并明确了具体的加密算法,需要注意,该算法应与上面第2步在命令行输入的algorithm值保持一致。

至此,即完成了对 Springboot 配置信息的加密。

参考资料

Github: jasypt-spring-boot: Jasypt integration for Spring boot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pierre_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值