SpringBoot整合Jasypt实现配置文件加密的实战指南
引言
SpringBoot 的 application.yml 里经常要写数据库密码、Redis 密码、API 密钥等敏感信息。直接把明文写在配置文件里提交到 Git,等于把密码公开了。Jasypt(Java Simplified Encryption)可以对这些敏感信息加密,启动时自动解密。
一、为什么需要配置加密
# ❌ 明文配置(危险!)
spring:
datasource:
url: jdbc:mysql://localhost:3306/seckill_db
username: root
password: 123456 # ← 密码暴露在配置文件里
# ✅ 加密配置(安全!)
spring:
datasource:
url: jdbc:mysql://localhost:3306/seckill_db
username: root
password: ENC(加密后的密文) # ← 别人看不懂安全风险:
- 代码提交到 Git 仓库 → 密码泄露
- 开发人员都能看到生产密码
- 项目外包时源码外流
二、集成 Jasypt
1. 引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>2. 配置加密密钥
jasypt:
encryptor:
password: mySecretKey # 加密密钥(不要写在配置里!)
algorithm: PBEWithMD5AndDES重要: 这个 password 建议通过环境变量或启动参数传入,不要写在 yml 里:
java -jar app.jar --jasypt.encryptor.password=mySecretKey
或者设置在环境变量中:
# Windows 系统环境变量 set JASYPT_ENCRYPTOR_PASSWORD=mySecretKey # Linux export JASYPT_ENCRYPTOR_PASSWORD=mySecretKey
配置中使用环境变量的引用:
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}三、加密与解密
1. 命令行加密(推荐)
# 下载 Jasypt 的 jar 包后,命令行加密 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \ input="123456" \ password=mySecretKey \ algorithm=PBEWithMD5AndDES # 输出: # ----OUTPUT---------------------- # O7v7T4H6zXkZp8V3YwA9Bw==
2. Java 代码加密(测试用)
@SpringBootTest
class JasyptTest {
@Test
void testEncrypt() {
// 加密
StringEncryptor encryptor = new DefaultEncryptor();
String encrypted = encryptor.encrypt("123456");
System.out.println("加密后: " + encrypted);
// 输出: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)
// 解密
String decrypted = encryptor.decrypt(encrypted);
System.out.println("解密后: " + decrypted);
// 输出: 123456
}
}
3. 配置密文
把生成的密文用 ENC() 包裹,替换 yml 中的明文:
spring:
datasource:
url: jdbc:mysql://localhost:3306/seckill_db
username: root
password: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)
redis:
host: localhost
password: ENC(XyZ8pQ3mN5vB2kL7)
# 自定义配置也可以加密
app:
api-key: ENC(H9jK2mN4pQ6rS8tU)启动时 Jasypt 会自动解密 ENC(...) 包裹的内容。
四、加密密钥的安全管理
加密密钥(jasypt.encryptor.password)是所有加密数据的钥匙——它本身不能加密,需要单独管理:
| 环境 | 推荐方案 |
|---|---|
| 本地开发 | 环境变量 |
| 测试服务器 | 环境变量 |
| 生产环境 | 配置中心 或 启动参数 |
生产环境推荐使用启动参数(安全最高):
# 从专门的密钥管理服务获取 # 或者在启动脚本中手动输入(不写入任何文件) java -jar app.jar \ --jasypt.encryptor.password=$(cat /etc/secrets/jasypt.key) \ --spring.profiles.active=prod
五、处理配置中的特殊字符
# 如果密码包含特殊字符(如 $、%、&),需要 URL 编码 password: ENC(abc%3Ddef) # %3D 是 = 的 URL 编码 # 或者在生成密文时指定 # 命令行生成时,用单引号包裹 java -cp jasypt.jar ... input='P@ssw0rd!' ...
六、自定义加密算法
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}
algorithm: PBEWITHHMACSHA512ANDAES_256 # 更强的算法
iv-generator-classname: org.jasypt.iv.RandomIvGenerator需要 Java 密码扩展包(JCE):
<!-- SpringBoot 3.x 默认支持 AES-256 --> <!-- SpringBoot 2.x 需要额外配置 JCE -->
七、多密钥支持
不同配置项使用不同密钥加密:
jasypt:
encryptor:
# 默认密钥
password: ${JASYPT_ENCRYPTOR_PASSWORD}
# 不同 Bean 使用不同密钥
bean:
- encryptorName: dbEncryptor
password: ${DB_ENCRYPTOR_PASSWORD}
- encryptorName: apiEncryptor
password: ${API_ENCRYPTOR_PASSWORD}@Configuration
public class JasyptConfig {
@Bean("dbEncryptor")
public StringEncryptor dbEncryptor(
@Value("${jasypt.encryptor.bean[0].password}") String password) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPassword(password);
encryptor.setAlgorithm("PBEWithMD5AndDES");
return encryptor;
}
}
spring:
datasource:
password: ENC(xxx) # 使用默认密钥
app:
third-party-key: ENC(yyy) # 也使用默认密钥八、常见问题
1. 启动时报错 DecryptionException
# 原因:密钥不正确或密文被修改 # 解决:确认启动时传入的密钥和加密时使用的密钥一致 # 检查环境变量 echo $JASYPT_ENCRYPTOR_PASSWORD
2. 加密后启动正常,但连接数据库报错
# 原因:连接字符串中也包含密码信息 # 解决:整个 URL 加密不方便,只加密密码部分即可
3. 多环境配置
# application-dev.yml(开发环境可以明文,方便调试)
spring:
datasource:
password: 123456
# application-prod.yml(生产环境加密)
spring:
datasource:
password: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)# 开发环境启动直接跑
java -jar app.jar --spring.profiles.active=dev
# 生产环境需要传入密钥
java -jar app.jar \
--spring.profiles.active=prod \
--jasypt.encryptor.password=${JASYPT_PASSWORD}九、最佳实践
- 永远不要在代码里硬编码加密密钥
- 生产环境和开发环境使用不同的密钥
- 密钥定期更换(更换时重新加密所有配置)
- 密钥存储在专门的密钥管理服务(如 HashiCorp Vault、阿里云 KMS)
- 配置文件和密钥分开管理——配置文件可以提交 Git,密钥通过环境变量注入
到此这篇关于SpringBoot整合Jasypt实现配置文件加密的实战指南的文章就介绍到这了,更多相关SpringBoot Jasypt配置文件加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java后端+前端使用WebSocket实现消息推送的详细流程
后端向前端推送消息就需要长连接,首先想到的就是websocket,下面这篇文章主要给大家介绍了关于java后端+前端使用WebSocket实现消息推送的详细流程,需要的朋友可以参考下2022-10-10


最新评论