保护密码等敏感信息的几个常用方法

devtools/2025/2/27 17:25:47/

概述

在生产环境,保护数据库账号密码等敏感信息是至关重要的,这些信息不能被所有研发工程师看见,本文介绍几种避免明文存储的常用方法。


方法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_USERNAMEvalueFrom:secretKeyRef:name: db-secretkey: username- name: DB_PASSWORDvalueFrom:secretKeyRef:name: db-secretkey: password
    

方法3: 集成密钥管理服务(KMS)

适用场景:高安全性要求,云原生环境。
推荐工具

  • HashiCorp Vault:动态生成数据库凭据,自动轮换密钥。
  • AWS KMS/阿里云KMS:与云服务深度集成,加密敏感数据。
  • 操作示例(Vault)
    1. 启动Vault并启用数据库密钥引擎:
      vault secrets enable database
      vault write database/config/mysql plugin_name=mysql-database-plugin ...
      
    2. 微服务通过Vault API动态获取临时数据库凭据。

方法4: 应用层加密(如Jasypt)

适用场景:无配置中心,需直接在应用内解密。
方案

  • 使用加密工具库(如Jasypt)对配置项加密。
  • Spring Boot集成步骤
    1. 添加依赖:
      <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
      </dependency>
      
    2. 加密密码:
      java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \input="123456" password=MySecretKey algorithm=PBEWithMD5AndDES
      
    3. 配置文件中使用密文:
      spring:datasource:password: ENC(密文字符串)
      
    4. 启动时传入密钥:
      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 中存储加密配置

  1. 登录 Nacos 控制台,创建配置文件(如 my-service-dev.yaml)。
  2. 将敏感字段替换为 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:8848namespace: devfile-extension: yamljasypt:encryptor:password: MySecretKey  # 与加密时使用的密钥一致algorithm: PBEWithMD5AndDES  # 加密算法需一致

(3) 代码中读取配置

直接通过 @Value 注入即可,Jasypt 会自动解密:

java">@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. 完整流程示例

  1. 加密敏感数据

    java -cp jasypt-1.9.3.jar ... JasyptPBEStringEncryptionCLI input="db_password" password=MySecretKey
    

    输出密文:ABC123

  2. Nacos 配置

    spring:datasource:password: ENC(ABC123)
    
  3. 客户端启动命令

    java -Djasypt.encryptor.password=MySecretKey -jar app.jar
    

6. 使用 Nacos 插件(可选)

若需 Nacos 服务端原生支持加密,可开发自定义插件或使用企业版功能:

  1. Nacos 服务端插件:通过 SPI 机制扩展加密逻辑。
  2. 企业版加密:阿里云 MSE Nacos 商业版支持配置加密

nacos_267">nacos案例小结

  • 核心步骤:Jasypt 加密敏感字段 → Nacos 存储密文 → 客户端通过密钥自动解密。
  • 关键安全点
    • 密钥通过环境变量或启动参数传递,避免泄露。
    • 定期轮换密钥,结合云厂商的KMS(如阿里云KMS)管理密钥更安全。

http://www.ppmy.cn/devtools/163118.html

相关文章

前端多个项目放在一个域名下如何配置打包文件

一、原因 当前端有三个项目&#xff0c;比如&#xff0c;大学生后台管理系统、大学生手机端网页、大学生电脑端网页&#xff0c;这三个项目想放在同一个域名下&#xff0c;此时就需要对项目打包配置进行更改&#xff0c;才能实现。 注&#xff1a;如果前端三个项目请求同一个后…

Redis面试宝典【刷题系列】

文章目录 一、什么是Redis&#xff1f;二、Redis相比Memcached有哪些优势&#xff1f;三、Redis支持的数据类型有哪些&#xff1f;四、Redis的主要消耗的物理资源是什么&#xff1f;五、Redis的全称是什么&#xff1f;六、Redis有哪些数据淘汰策略&#xff1f;七、为什么Redis需…

python爬虫学习第十一篇爬取指定类型数据

最近在学习Python爬虫的过程中&#xff0c;尝试用爬虫获取指定类型的数据。今天&#xff0c;我想和大家分享一下我的实践过程和遇到的问题。 一、实现目标 目标是从一个网站的API接口获取不同类型的食品数据。 比如&#xff0c;第一步我想获取汉堡、小食、甜品等不同类型的数…

计算机毕设-基于springboot的人工智能领域复合型人才校企协同培养管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

大白话css第二章深入学习

CSS学习第二阶段主要是深入掌握一些更复杂、更实用的知识和技能&#xff0c;以下用大白话为你详细介绍并给出代码示例&#xff1a; 盒模型与布局 盒模型深入理解 解释&#xff1a;前面说过每个HTML元素像个盒子&#xff0c;现在要更深入了解。内容区域就是盒子里真正放东西的…

怎么合并主从分支,要注意什么

在 Git 中合并主从分支&#xff08;例如将 feature 分支合并到 main 分支&#xff09;是一个常见操作。以下是具体步骤和注意事项&#xff1a; 合并分支的步骤 切换到主分支 git checkout main确保当前在 main 分支。 拉取最新代码 git pull origin main确保 main 分支是最…

如果二者隔离级别不一致,以哪个为主。例如@Transactional 隔离级别是RC,mysql是RR

如果 Spring 的 Transactional 隔离级别 和 数据库的隔离级别 不一致&#xff0c;最终生效的隔离级别取决于以下两种情况&#xff1a; 1. Spring 隔离级别优先级更高 Spring 的行为&#xff1a; 当你在 Transactional 注解中显式配置了隔离级别&#xff08;例如 isolation Iso…

排序模板——C++

0.排序模板题目 题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 …