Spring Boot 配置文件敏感信息加密:Jasypt 实战
目录
1. 为什么需要加密配置文件?
2. Jasypt 快速集成
2.1 在xml文件中添加 Maven 依赖
2.2 生成加密字符串
编辑
编辑
3. 安全最佳实践
4. 常见问题
Q1:加密后启动报错?
Q2:加密算法如何选择?
5. 总结
1. 为什么需要加密配置文件?
在 Spring Boot 项目中,敏感信息(如数据库密码、API Key、Redis 密码等)通常直接写在 application.properties
或 application.yml
中(如下图所示),存在以下风险:
- 代码泄露:配置文件可能被上传到 Git,导致密码暴露。
- 运维风险:服务器被入侵时,攻击者可直接读取明文密码。
- 合规性要求:部分行业(如金融、医疗)强制要求加密存储敏感信息。
解决方案:使用 Jasypt(Java Simplified Encryption)对敏感信息加密,运行时自动解密,兼顾安全与便捷。
2. Jasypt 快速集成
2.1 在xml文件中添加 Maven 依赖
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>
2.2 生成加密字符串
那他是如何进行加密解密的呢?然我们进入这个组件的源码(加密部分):
input是你要输入的内容,后面的password是密钥,用于给上面inport的内容解密
我们来看一下下面optional的内容,我们有什么可以选择的呢?
解密部分:
那么我们如何去使用这样的一个工具呢?
在命令行中输入:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=huihui algorithm=PBEWithMD5AndDES
执行这条命令之后:password的内容就是我们指定的密钥
将output的内容拷下。接着加入到yml配置文件当中,我们在将root改为我们加密后的内容需要用ENC封装:
username: ENC(ugBjFufNHYJiS+kbJG1Uvg==) //ENC括号的内容表示这是加密后的内容
接着,我们用同样的方式加密我们的密码,内容都是一样的,只是input的内容不一样:
我们现在已经完成了加密的部分,剩下的就是整个项目需要通过我加密的内容获取其真实的内容,这样,他才可以去访问到数据,那么现在有两种方式去解密:
方式一:在yml配置文件里面配置好密钥
jasypt:encryptor:password: huihui # 必须与加密时使用的password参数一致algorithm: PBEWithMD5AndDES # 必须与加密时使用的algorithm参数一致iv-generator-classname: org.jasypt.iv.NoIvGenerator# 注意:PBEWithMD5AndDES是较旧算法,演示环境下没有问题# 建议升级到更安全的算法如PBEWithHMACSHA512AndAES_256
然后再在启动文件处(一般是…Application)加入@EnableEncryptableProperties注解表示开启密码解析。接着再去启动整个应用:
数据库数据正确查出。
但是!!!
此时,你的密钥就写在yml配置文件中,等于把要是直接给了其他人,让没有权限的人也可以登陆获取数据,所以这种方式很不安全。那么,我们开始另外一种方式。
方式二:我们手动的在项目启动的时候手动加一个动态参数
//加入的分别是以下冒号后面的内容
Name: JASYPT_ENCRYPTOR_PASSWORD
Value: huihuiName: JASYPT_ENCRYPTOR_ALGORITHM
Value: PBEWithMD5AndDES
接着,yml文件也应该相应的改变:
jasypt:encryptor:password: ${JASYPT_ENCRYPTOR_PASSWORD:} # 从环境变量读取algorithm: ${JASYPT_ENCRYPTOR_ALGORITHM:PBEWithMD5AndDES} # 默认算法iv-generator-classname: org.jasypt.iv.NoIvGenerator # MD5AndDES必须禁用IV
数据访问成功!!!
3. 安全最佳实践
- 密钥管理:
- 生产环境务必使用环境变量或云服务(如 AWS KMS)。
- 禁止将密钥提交到 Git。
- 密钥轮换:
定期更换加密密钥,并重新加密所有配置。 - 日志脱敏:
避免敏感信息打印到日志(配置logback.xml
过滤ENC(*)
)。 - 最小权限:
仅允许必要服务访问密钥。
4. 常见问题
Q1:加密后启动报错?
- 检查密钥是否一致。
- 确认依赖版本无冲突(Spring Boot 2.x 用
jasypt-spring-boot-starter 3.x
)。
Q2:加密算法如何选择?
- 默认
PBEWithMD5AndDES
已不安全,建议PBEWithHMACSHA512AndAES_256
。
5. 总结
通过 Jasypt 可以低成本实现 Spring Boot 配置文件的敏感信息加密,关键步骤:
- 引入依赖:
jasypt-spring-boot-starter
。 - 加密数据:用命令行或代码生成
ENC(密文)
。 - 安全存储密钥:优先用环境变量或启动参数。