Spring Boot 项目配置文件密码加密解决方案 —— Jasypt 实战指南

🔒 别再把数据库、Redis、MQ 的密码明文写在 application.yml 里了!

你是否也在 Spring Boot 项目中这样配置 Redis?

复制代码
spring:
  redis:
    username: danny # ⚠️ 危险!明文密码!
    password: 123456
    host: r-89adfadjf9ladk.redis.rds.dannycloud.com
    port: 6379

如果答案是"是",请立即停止并修改!一旦代码被提交到 Git 仓库、配置文件被泄露,你的服务将面临严重安全风险。

好消息是:Jasypt 是目前最主流、最轻量、且与 Spring Boot 集成最友好的配置加密方案。本文将以 加密 Redis 密码 为例,手把手教你实现安全配置。

为什么选择Jasypt?

  • 零侵入:只需添加 starter,无需修改业务代码
  • 自动解密 :Spring Boot 启动时自动识别 ENC(...) 并解密
  • 算法安全:支持 AES-256、PBKDF2 等现代加密标准
  • 社区成熟:GitHub 超 5k stars,广泛用于生产环境

🛠️ 实施步骤

步骤1:添加依赖

复制代码
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

💡 注意:该 starter 已内置兼容的 jasypt-core无需单独引入 jasypt 原生库

步骤2:配置加密密钥(从环境变量获取)

application.yml 中添加 Jasypt 配置:

复制代码
jasypt:
  encryptor:
    password: ${ENCRYPT_KEY}  
    algorithm: PBEWithHMACSHA512ANDAES_256
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

🔑 关于 ENCRYPT_KEY 的重要说明:

  • 这是加密主密钥(Master Key),用于派生实际加密密钥
  • 绝对不要将其写入任何配置文件或代码中!
  • 推荐通过以下方式传入:
    • Docker-e ENCRYPT_KEY=MySuperSecureEncryptionKey12345!
    • 启动命令java -jar app.jar --jasypt.encryptor.password=xxx
    • K8s Secret / Vault:更高级的密钥管理方案

✅ 密钥建议:使用 32 字节以上的强随机字符串 ,例如:MySuperSecureEncryptionKey12345!

步骤3:加密你的敏感密码

下载Jasypt命令行工具(仅用于加密,不需打包进项目):👉 https://repo1.maven.org/maven2/org/jasypt/jasypt/1.9.3/jasypt-1.9.3.jar)

执行加密命令:

复制代码
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
input="123456" \
password=MySuperSecureEncryptionKey12345! \
algorithm=PBEWithHMACSHA512ANDAES_256 \
ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator

参数详解:

  • org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI是Jasypt 提供的命令行加密工具主类。

  • input为要加密的密码明文(比如这里的123456就是我项目中Redis的密码),如果密码包含特殊字符(如 $, !, & 等),建议用单引号包裹或转义,避免 shell 解析错误。

  • algorithm 指定使用的加密算法,PBEWithHMACSHA512ANDAES_256 算法表示:使用 PBKDF2 从 password 派生密钥,HMAC-SHA512 作为 PRF(伪随机函数),AES-256 作为对称加密算法。

  • password为要加密的秘钥(口令),它不是你要加密的内容,而是用来派生实际加密密钥的"种子",⚠️ 这个密钥绝不能写在配置文件里! 应通过环境变量或者启动参数传入。对于 PBEWithHMACSHA512ANDAES_256 算法,建议使用 至少 32 字节(即 32 个字符)的强随机字符串 ,例如:MySuperSecureEncryptionKey12345!

  • ivGeneratorClassName 指定初始化向量(IV)生成器,RandomIvGenerator 表示每次加密都使用随机 IV,提高安全性(防止相同明文加密出相同密文)。这是推荐做法,应尽量避免使用固定 IV(如 NoIvGenerator)。

执行后OUTPUT即为加密后的密码:

步骤4:修改包含密码的配置文件

将步骤3中生成的密码密文包装在 ENC(...) 中,更新配置:

复制代码
spring:
  redis:
    username: danny
    password: ENC(ScpMupqFoX4lhwTjRAhQIQd/YcZyS5IuHOcHGeIbvv2hUvX70lvAuDeMmIJ9fL/T)
    host: r-89adfadjf9ladk.redis.rds.dannycloud.com
    port: 6379

✅ 启动应用时,Jasypt 会自动解密 ENC(...) 内容,Redis 连接不受影响!


🚀 部署建议(生产环境必看)

密钥管理

  • 开发环境:可通过 .env 或启动参数临时使用
  • 生产环境:务必使用 密钥管理服务(如 HashiCorp Vault、AWS KMS、阿里云 KMS)

避免命令行历史泄露

执行加密命令时,不要直接在 shell 中写明 password=xxx,建议:

复制代码
read -s -p "Enter encrypt key: " KEY
java -cp jasypt-1.9.3.jar ... password="$KEY"

替代方案参考

  • 若使用 Spring Cloud Config,可结合 Vault 或 native encryption
  • 若追求极致安全,可考虑 应用启动时动态拉取密钥

❌ 常见误区

误区 正确做法
ENCRYPT_KEY 写在 application.yml 必须通过环境变量或外部传参
使用弱算法如 PBEWithMD5AndDES 坚持使用 PBEWithHMACSHA512ANDAES_256
认为"内网就安全" 内部泄露同样会造成重大损失
手动下载不明来源的 .jar 文件 仅从 Maven Central 等官方源获取

✅ 总结

通过 Jasypt,我们以极低的成本实现了配置文件的敏感信息脱敏,既满足安全合规要求,又不影响开发体验。记住:

密钥不在代码中,密码不在配置里 ------ 这是现代应用安全的第一道防线。

赶快检查你的项目,给那些明文密码"穿上盔甲"吧!

相关推荐
晨非辰1 小时前
Linux权限管理速成:umask掩码/file透视/粘滞位防护15分钟精通,掌握权限减法与安全协作模型
linux·运维·服务器·c++·人工智能·后端
2501_941507942 小时前
【YOLOv26】教育环境中危险物品实时检测系统_基于深度学习的校园安全解决方案
深度学习·安全·yolo
延凡科技6 小时前
无人机低空智能巡飞巡检平台:全域感知与智能决策的低空作业中枢
大数据·人工智能·科技·安全·无人机·能源
晓翔仔7 小时前
【深度实战】Agentic AI 安全攻防指南:基于 CSA 红队测试手册的 12 类风险完整解析
人工智能·安全·ai·ai安全
开发者小天8 小时前
python中For Loop的用法
java·服务器·python
flushmeteor8 小时前
JDK源码-基础类-String
java·开发语言
毕设源码-钟学长9 小时前
【开题答辩全过程】以 基于ssm的空中停车场管理系统为例,包含答辩的问题和答案
java
不愿是过客9 小时前
java实战干货——长方法深递归
java
chipsense10 小时前
守住安全底线:2026年电动汽车充电桩漏电流(RCD)检测技术深度博弈
安全·充电桩·磁通门传感器·漏电流检测
小北方城市网10 小时前
Redis 分布式锁高可用实现:从原理到生产级落地
java·前端·javascript·spring boot·redis·分布式·wpf