Skip to content

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最强,动态密钥、审计大厂/合规场景

关键原则 ​

  1. 加密密钥(master key)绝不能和密文放一起(否则等于没加密);
  2. 密钥从环境变量/启动参数/Secret 注入;
  3. 日志、异常信息里不能打印明文密钥;
  4. 密钥定期轮换;
  5. 密文被反编译/看配置文件也解不出来,只有拿到密钥才能解。

加分点 ​

  • 说 Jasypt 默认算法(PBEWithMD5AndDES)弱,可配更强的(如 PBEWITHHMACSHA512ANDAES_256);
  • 提到"配置脱敏"与"传输加密"配合:数据库连接也建议 SSL;
  • 分布式场景优先配置中心 + 密钥托管,便于统一轮换。

一句话总结 ​

SpringBoot 敏感配置加密用 **Jasypt(ENC 密文 + 外部密钥)**最省事;微服务用配置中心加密,云原生用 K8s Secret/Vault;核心原则是密文与密钥分离、密钥从环境注入、定期轮换、不泄露到日志。

基于 VitePress 重建