SpringBoot集成 Jasypt 实现数据源连接信息进行加密
在实际项目中,敏感信息(如数据库连接的 URL、用户名、密码等)直接暴露在配置文件中可能导致安全隐患。为了解决这一问题,可以使用 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 工具
- 下载 CLI 工具
下载 jasypt-1.9.3-dist.zip,解压后进入jasypt-1.9.3-dist\jasypt-1.9.3\lib
目录。 - 执行加密命令
使用以下命令生成加密密文:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="明文数据" password=加密密钥 algorithm=PBEWithHMACSHA256AndAES_128 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
示例输出:
ENC(U2FsdGVkX1+...)
- 解密验证
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 支持多种加密算法,以下是常见算法及其特点:
算法名称 | 特点 |
|
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 |
六、安全注意事项
- 加密密钥管理
- 加密密钥建议通过环境变量或密钥管理工具传递,避免硬编码在配置文件中。
- 使用复杂的密钥,例如包含字母、数字和特殊字符的随机字符串。
- 生产环境建议
- 数据库连接信息的加密仅是基础安全措施,建议结合防火墙、网络隔离等多层次保护。
- 定期更换加密密钥,并重新加密敏感数据。
- 性能权衡
- 高安全性算法如
PBEWithHMACSHA512AndAES_256
对性能要求更高,需根据实际情况选择合适的算法。
七、总结
通过集成 Jasypt,可以有效保护 Spring Boot 项目中的敏感信息,提升安全性。在实际使用中,可以结合其他安全措施(如环境变量、权限控制)进一步加强数据保护。