SpringBoot集成 Jasypt 实现数据源连接信息进行加密

在实际项目中,敏感信息(如数据库连接的 URL、用户名、密码等)直接暴露在配置文件中可能导致安全隐患。为了解决这一问题,可以使用 Jasypt 来加密敏感信息,并在运行时解密,从而有效提升安全性。

SpringBoot集成 Jasypt 实现数据源连接信息进行加密_后端


一、什么是 Jasypt

Jasypt(Java Simplified Encryption) 是一个开源的 Java 加密工具库,它支持对配置文件中的敏感数据进行加密和解密操作,特别适用于 Spring Boot 项目。


二、项目环境准备

1. 添加 Jasypt 依赖

pom.xml 中添加以下依赖,可在https://mvnrepository.com查看最新版本:

<dependency>
  <groupId>com.github.ulisesbocchio</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>3.0.5</version>
</dependency>
2. 数据库配置示例

application.yml 中定义数据库配置:

spring:
  datasource:
    url: ENC(U2FsdGVkX1+...)
    username: ENC(U2FsdGVkX1+...)
    password: ENC(U2FsdGVkX1+...)
  rabbitmq:
    host: ENC(U2FsdGVkX1+...)
    port: ENC(U2FsdGVkX1+...)
    username: ENC(U2FsdGVkX1+...)
    password: ENC(U2FsdGVkX1+...)
  redis:
    host: ENC(U2FsdGVkX1+...)
    port: ENC(U2FsdGVkX1+...)
    database: ENC(U2FsdGVkX1+...)
    password: ENC(U2FsdGVkX1+...)
jasypt:
  encryptor:
    # 加密的密钥,生成环境放到启动参数配置
    password: ${JASYPT_ENCRYPTOR_PASSWORD:默认秘钥}
    # 加密算法
    algorithm: PBEWithHMACSHA256AndAES_128
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    # 算法识别的前后缀,默认ENC()
    property:
      prefix: "ENC("
      suffix: ")"

以上 ENC(...) 是加密后的密文,将在后续步骤中生成。


三、生成加密密文

Jasypt 提供多种工具生成加密密文,以下分别介绍两种方式:

方法 1:使用 Jasypt CLI 工具
  1. 下载 CLI 工具
    下载 jasypt-1.9.3-dist.zip,解压后进入jasypt-1.9.3-dist\jasypt-1.9.3\lib目录。
  2. 执行加密命令
    使用以下命令生成加密密文:
java  -cp  jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="明文数据" password=加密密钥  algorithm=PBEWithHMACSHA256AndAES_128 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator

示例输出

ENC(U2FsdGVkX1+...)
  1. 解密验证
java  -cp  jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="密文数据" password=加密秘钥  algorithm=PBEWithHMACSHA256AndAES_128 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
方法 2:使用 Java 代码生成密文

编写以下代码:

public class JasyptEncryptorDemo {
	public static void main(String[] args) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("加密秘钥");
        config.setAlgorithm("PBEWithHMACSHA256AndAES_128"); // 加密方式
        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);
        System.out.println(encryptor.encrypt("明文数据")); // 加密
        System.out.println(encryptor.decrypt("密文数据")); // 解密
    }
}

执行后,控制台输出加密密文。


四、解密与运行验证

1. 配置 Jasypt 解密器

application.yml 中配置解密相关参数:

jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD:secureKey123!}   # 环境变量优先
    algorithm: PBEWithHMACSHA512AndAES_256
    property:
      prefix: "ENC("
      suffix: ")"
2. 编写解密验证代码

创建一个测试控制器,验证加密后的配置是否能正确解密:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Value("${spring.datasource.password}")
    private String password;

    @GetMapping("/test")
    public String testDecryption() {
        return "Decrypted password: " + password;
    }
}

运行项目,访问 /test,若解密成功,将返回明文密码。


五、常见加密算法

Jasypt 支持多种加密算法,以下是常见算法及其特点:

算法名称

特点

ivGeneratorClassName

PBEWithMD5AndDES

基于 MD5 和 DES 的加密算法,安全性较低,不建议在生产环境使用。

org.jasypt.iv.NoIvGenerator

PBEWithMD5AndTripleDES

使用 MD5 生成密钥,Triple DES(3DES)进行加密;比单 DES 更安全,适合一般安全需求场景。

org.jasypt.iv.NoIvGenerator

PBEWithHMACSHA256AndAES_128

使用 SHA-256 和 AES-128,兼顾性能与安全性;性能和安全性平衡,适用大部分应用场景。

org.jasypt.iv.RandomIvGenerator

PBEWithHMACSHA512AndAES_256

高安全性算法,适用于需要高敏感数据保护的场景;(金融等)。

org.jasypt.iv.RandomIvGenerator


六、安全注意事项

  1. 加密密钥管理
  • 加密密钥建议通过环境变量或密钥管理工具传递,避免硬编码在配置文件中。
  • 使用复杂的密钥,例如包含字母、数字和特殊字符的随机字符串。
  1. 生产环境建议
  • 数据库连接信息的加密仅是基础安全措施,建议结合防火墙、网络隔离等多层次保护。
  • 定期更换加密密钥,并重新加密敏感数据。
  1. 性能权衡
  • 高安全性算法如 PBEWithHMACSHA512AndAES_256 对性能要求更高,需根据实际情况选择合适的算法。

七、总结

通过集成 Jasypt,可以有效保护 Spring Boot 项目中的敏感信息,提升安全性。在实际使用中,可以结合其他安全措施(如环境变量、权限控制)进一步加强数据保护。