SpringBoot集成 Jasypt 实现数据源连接信息进行加密
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_128iv-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_256property: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 |
六、安全注意事项
-
加密密钥管理
- 加密密钥建议通过环境变量或密钥管理工具传递,避免硬编码在配置文件中。
- 使用复杂的密钥,例如包含字母、数字和特殊字符的随机字符串。
-
生产环境建议
- 数据库连接信息的加密仅是基础安全措施,建议结合防火墙、网络隔离等多层次保护。
- 定期更换加密密钥,并重新加密敏感数据。
-
性能权衡
- 高安全性算法如
PBEWithHMACSHA512AndAES_256
对性能要求更高,需根据实际情况选择合适的算法。
- 高安全性算法如
七、总结
通过集成 Jasypt,可以有效保护 Spring Boot 项目中的敏感信息,提升安全性。在实际使用中,可以结合其他安全措施(如环境变量、权限控制)进一步加强数据保护。