本文目录导读:

针对“密码明文存储”的安全隐患,整改的核心原则是:永远不存储明文密码,只存储密码的哈希值,并配合使用“加盐”技术。
以下是具体的整改步骤和最佳实践方案,按照从紧急到长期的顺序排列:
第一阶段:紧急止血(立即执行)
停止所有明文存储行为
- 排查代码:立即查找所有数据库中
password、pwd、passwd等字段,以及日志文件、配置文件、缓存中是否存在明文密码。 - 切断源头:修改代码逻辑,在用户注册、修改密码、管理员创建用户等入口处,立即增加哈希处理,确保存入数据库的已经是哈希值,而非明文。
清理历史明文数据(高优先级)
- 通知用户:必须立即强制所有用户修改密码(通过邮件、短信或应用内通知),因为已经泄露的历史明文密码风险极高,攻击者可能已利用。
- 数据脱敏:将数据库中所有已存在的明文密码字段,用占位符(如
[HASHED_PASSWORD])或空字符串替换,并删除备份中可能存在的明文数据。 - 日志清理:清除所有包含明文密码的应用日志、错误日志、调试日志。
第二阶段:核心技术整改(系统改造)
核心方案:使用强哈希算法 + 随机盐值
切勿使用 MD5 或 SHA-1 等快速哈希算法(硬件算力可快速破解),必须使用计算慢、抗暴力破解的专用密码哈希算法。
推荐算法(二选一)
| 方案 | 算法 | 特点 | 适用场景 |
|---|---|---|---|
| 方案A(首选) | bcrypt | 内建盐值,可调节计算成本,抗GPU/ASIC攻击强,公认标准。 | 绝大多数Web应用、API、移动端。 |
| 方案B(替代) | Argon2 | 2015年密码哈希竞赛冠军,抗并行计算更强,配置灵活。 | 对安全性要求极高的金融、政务系统。 |
整改步骤(以 bcrypt 为例)
- 引入库:在项目中引入官方或社区认可的 bcrypt 库(如 Java 的
jBCrypt,Python 的bcrypt,Node.js 的bcryptjs)。 - 修改注册逻辑:
- 用户输入密码
myP@ssword123。 - 代码调用 bcrypt 库的
hashpw()函数,自动生成一个随机盐值并嵌入到哈希结果中。 - 将最终结果(
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy)存入数据库。 - 注意:无需单独存储盐值,bcrypt结果已自带。
- 用户输入密码
- 修改登录逻辑:
- 用户输入密码。
- 从数据库取出该用户的哈希值(例如上述字符串)。
- 调用
checkpw(rawPassword, storedHash)函数。 - 函数自动从哈希值中提取盐值,对明文进行哈希,然后比较结果。
- 修改旧用户密码:无法通过旧明文直接迁移,必须执行第一阶段中的强制重置密码流程。
第三阶段:纵深防御(长期加固)
传输层加密(HTTPS)
- 即使存储安全,如果密码在传输过程中被嗅探,依然等于明文。全站强制开启 HTTPS,防止中间人攻击。
密码策略
- 强度要求:至少8位,包含大小写字母、数字、特殊字符,且不允许常见弱密码(如
123456,password)。 - 防重复使用:在注册或修改密码时,通过API查询常见泄露密码数据库(如 Have I Been Pwned 的 Pwned Passwords API),禁止使用已知泄露密码。
- 锁定策略:连续多次(如5次)登录失败,临时锁定账户15-30分钟,防止暴力破解。
数据库安全
- 最小权限原则:应用连接数据库的账号,仅拥有对密码相关表(如
user表)的SELECT、UPDATE权限,严禁DROP、DELETE等危险权限。 - 审计日志:记录所有对密码表的异常访问(如批量SELECT、非工作时间查询)。
开发与运维规范
- 密码不落入代码:禁止在代码、配置文件、环境变量、注释中硬编码任何密码、令牌或密钥,使用专门的密钥管理服务(如 AWS Secrets Manager, HashiCorp Vault)。
- 代码审计:部署自动化扫描工具(如 SonarQube, Checkmarx)检测硬编码密码、弱哈希等安全漏洞。
- 日志脱敏:配置日志框架,在输出前自动脱敏掉
password,secret,token等字段的内容。
第四阶段:验证与监控
- 渗透测试:定期聘请安全团队进行黑盒测试,验证密码存储和传输的安全性。
- 入侵检测:部署WAF(Web应用防火墙)和IDS(入侵检测系统),监控异常登录、批量注册、密码枚举行为。
- 事件响应预案:制定一旦发现密码泄露(比如GitHub仓库意外暴露)后的紧急处理流程。
整改清单
| 步骤 | 紧急程度 | |
|---|---|---|
| 1 | 强制所有用户重置密码 | 立即 |
| 2 | 清理代码和数据库中的明文密码 | 立即 |
| 3 | 引入 bcrypt/Argon2 对密码做哈希+加盐处理 | 24小时内 |
| 4 | 全站部署HTTPS | 1周内 |
| 5 | 实施密码强度策略和登录锁定机制 | 1周内 |
| 6 | 建立代码审计和日志脱敏机制 | 1个月内 |
| 7 | 部署持续的安全监控与定期渗透测试 | 长期 |
最重要的一句话:永远不要自己写加密函数,永远使用经过广泛验证的、由安全专家维护的标准库(如 bcrypt, Argon2)。