保护密码等敏感信息的几个常用方法
概述
在生产环境,保护数据库账号密码等敏感信息是至关重要的,这些信息不能被所有研发工程师看见,本文介绍几种避免明文存储的常用方法。
方法1: 使用配置中心加密
适用场景:已采用配置中心(如Spring Cloud Config、Apollo、Nacos等)。
 方案:
- 服务端加密:在配置中心中对敏感字段进行加密(如Spring Cloud Config支持对称/非对称加密)。
- 客户端解密:微服务启动时从配置中心获取加密配置并解密。
- 操作步骤:# application.yml 示例(加密后的值以{cipher}开头) spring: datasource: username: "{cipher}密文字符串" password: "{cipher}密文字符串"- 生成密文:使用配置中心的 /encrypt端点加密明文。
- 配置密钥:在配置中心服务端设置 encrypt.key(对称加密)或encrypt.keyStore(非对称加密)。
 
- 生成密文:使用配置中心的 
方法2: 环境变量注入
适用场景:容器化部署(如Docker、Kubernetes)。
 方案:
- 通过环境变量传递敏感信息,避免写入配置文件。
- Kubernetes示例:# 创建Secret kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=123456# 在Deployment中引用Secret env: - name: DB_USERNAME valueFrom: secretKeyRef: name: db-secret key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password
方法3: 集成密钥管理服务(KMS)
适用场景:高安全性要求,云原生环境。
 推荐工具:
- HashiCorp Vault:动态生成数据库凭据,自动轮换密钥。
- AWS KMS/阿里云KMS:与云服务深度集成,加密敏感数据。
- 操作示例(Vault): 
  - 启动Vault并启用数据库密钥引擎:vault secrets enable database vault write database/config/mysql plugin_name=mysql-database-plugin ...
- 微服务通过Vault API动态获取临时数据库凭据。
 
- 启动Vault并启用数据库密钥引擎:
方法4: 应用层加密(如Jasypt)
适用场景:无配置中心,需直接在应用内解密。
 方案:
- 使用加密工具库(如Jasypt)对配置项加密。
- Spring Boot集成步骤: 
  - 添加依赖:<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
- 加密密码:java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \ input="123456" password=MySecretKey algorithm=PBEWithMD5AndDES
- 配置文件中使用密文:spring: datasource: password: ENC(密文字符串)
- 启动时传入密钥:java -Djasypt.encryptor.password=MySecretKey -jar app.jar
 
- 添加依赖:
方法5: 配置文件的linux权限控制
辅助措施:无论是否加密,均需限制文件访问权限。
- Linux示例:chmod 600 application.yml # 仅允许所有者读写 chown service-user:service-user application.yml # 归属服务运行用户
方法6: 避免硬编码与代码仓库泄露
- 将配置文件排除在代码仓库外(如.gitignore)。
- 使用占位符或外部化配置(如Spring Profiles)。
方法7: 轮换密钥和增加访问日志
- 务必定期轮换加密密钥。
- 审计敏感信息的访问日志。
小结
- 初级方案:环境变量 + 配置文件权限控制。
- 中级方案:配置中心加密(如Spring Cloud Config)或应用层加密(Jasypt)。
- 高级方案:集成Vault/AWS KMS,实现动态凭据与自动轮换。
案例
在 Nacos 中对敏感字段进行加密,通常需要结合 加密工具(如 Jasypt) 或 Nacos 插件 实现。本文介绍Nacos服务端配置和Java客户端解密过程。
1. 方案选择
- 推荐方式:使用 Jasypt 对敏感字段加密,将密文存储到 Nacos,客户端启动时通过密钥解密。
- 优势:无需修改 Nacos 服务端,兼容 Spring Boot/Cloud 生态,操作简单。
2. Nacos 服务端配置
(1) 生成加密后的密文
使用 Jasypt 工具生成敏感字段的密文:
# 下载 Jasypt 工具包(或通过 Maven 依赖调用)
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
     input="your_db_password" \
     password=MySecretKey \  # 加密密钥(需保管好)
     algorithm=PBEWithMD5AndDES
输出示例:
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.331-b09 
----ARGUMENTS-------------------
algorithm: PBEWithMD5AndDES
input: your_db_password
password: MySecretKey
----OUTPUT----------------------
uTS8YqJHBROG6BQx0YHa2QmM9r0q9J7T
(2) 在 Nacos 中存储加密配置
- 登录 Nacos 控制台,创建配置文件(如 my-service-dev.yaml)。
- 将敏感字段替换为 ENC(密文)格式:spring: datasource: username: ENC(密文) password: ENC(uTS8YqJHBROG6BQx0YHa2QmM9r0q9J7T)
3. Java 客户端配置
(1) 添加依赖
在 pom.xml 中引入 Jasypt 和 Spring Cloud Alibaba Nacos 依赖:
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2022.0.0.0</version>
</dependency>
(2) 配置解密密钥
在 bootstrap.yml 中指定 Jasypt 解密密钥:
spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        namespace: dev
        file-extension: yaml
  jasypt:
    encryptor:
      password: MySecretKey  # 与加密时使用的密钥一致
      algorithm: PBEWithMD5AndDES  # 加密算法需一致
(3) 代码中读取配置
直接通过 @Value 注入即可,Jasypt 会自动解密:
@Value("${spring.datasource.username}")
private String dbUser;
@Value("${spring.datasource.password}")
private String dbPassword;
4. 安全增强措施
(1) 避免硬编码密钥
通过环境变量或启动参数传递密钥,而非写在配置文件中:
java -Djasypt.encryptor.password=MySecretKey -jar your-app.jar
在 bootstrap.yml 中动态引用环境变量:
jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD:}  # 从环境变量读取
(2) 配置文件权限控制
确保 Nacos 配置文件的权限仅限于授权用户:
chmod 600 my-service-dev.yaml
(3) 密钥轮换
定期更换加密密钥,并重新生成所有密文。
5. 完整流程示例
-  加密敏感数据: java -cp jasypt-1.9.3.jar ... JasyptPBEStringEncryptionCLI input="db_password" password=MySecretKey输出密文: ABC123
-  Nacos 配置: spring: datasource: password: ENC(ABC123)
-  客户端启动命令: java -Djasypt.encryptor.password=MySecretKey -jar app.jar
6. 使用 Nacos 插件(可选)
若需 Nacos 服务端原生支持加密,可开发自定义插件或使用企业版功能:
- Nacos 服务端插件:通过 SPI 机制扩展加密逻辑。
- 企业版加密:阿里云 MSE Nacos 商业版支持配置加密。
nacos案例小结
- 核心步骤:Jasypt 加密敏感字段 → Nacos 存储密文 → 客户端通过密钥自动解密。
- 关键安全点: 
  - 密钥通过环境变量或启动参数传递,避免泄露。
- 定期轮换密钥,结合云厂商的KMS(如阿里云KMS)管理密钥更安全。
 
