P43 如何对 SpringBoot 配置文件敏感信息加密
面试题:SpringBoot 的 application.yml 里有数据库密码、密钥等明文,怎么加密?
常见方案
1. Jasypt(最常用)
用 jasypt-spring-boot-starter 对配置值加密,配置文件里存密文,启动时解密:
yaml
spring:
datasource:
password: ENC(加密后的密文)
jasypt:
encryptor:
password: ${JASYPT_PASSWORD} # 加密密钥,从环境变量/启动参数注入,不写死在配置里bash
java -jar app.jar --jasypt.encryptor.password=xxx原理:读取配置时发现 ENC(...) 包裹的值 → 用密钥解密后注入。
2. Spring Cloud Config + 配置中心加密
配置放配置中心(Nacos/Apollo/Spring Cloud Config),服务端支持密钥加密,客户端拉取时解密;密钥不随应用包分发。
3. 外部化密钥 + 环境变量
配置里不写真实值,用占位符引用环境变量:
yaml
spring:
datasource:
password: ${DB_PASSWORD}密钥只存在于部署环境(K8s Secret、CI 变量),代码库零敏感信息。
4. K8s Secret / 密钥管理系统
- K8s 里用 Secret 挂载到环境变量/文件;
- 企业级用 Vault(HashiCorp Vault)动态签发和托管密钥,应用运行时拉取。
方案对比
| 方案 | 特点 | 适用 |
|---|---|---|
| Jasypt | 简单、开箱即用,密文在配置里 | 单体/小团队 |
| 配置中心加密 | 集中管理 + 动态刷新 | 微服务 |
| 环境变量/K8s Secret | 代码零密钥,运维侧管理 | 云原生部署 |
| Vault | 最强,动态密钥、审计 | 大厂/合规场景 |
关键原则
- 加密密钥(master key)绝不能和密文放一起(否则等于没加密);
- 密钥从环境变量/启动参数/Secret 注入;
- 日志、异常信息里不能打印明文密钥;
- 密钥定期轮换;
- 密文被反编译/看配置文件也解不出来,只有拿到密钥才能解。
加分点
- 说 Jasypt 默认算法(PBEWithMD5AndDES)弱,可配更强的(如 PBEWITHHMACSHA512ANDAES_256);
- 提到"配置脱敏"与"传输加密"配合:数据库连接也建议 SSL;
- 分布式场景优先配置中心 + 密钥托管,便于统一轮换。
一句话总结
SpringBoot 敏感配置加密用 **Jasypt(ENC 密文 + 外部密钥)**最省事;微服务用配置中心加密,云原生用 K8s Secret/Vault;核心原则是密文与密钥分离、密钥从环境注入、定期轮换、不泄露到日志。