本文目录导读:

密码明文存储是严重的安全隐患,整改需要从技术、管理、架构三个层面系统推进,以下是标准整改方案:
立即停止并排查(紧急措施)
- 全面审计:扫描所有数据库、日志文件、备份文件、配置文件,找出所有明文密码的存储点(包括用户密码、数据库连接密码、API密钥、SSH密钥等)。
- 截断风险:
- 如果发现用户密码明文存储,立即通知受影响用户强制重置密码,并在系统前端禁止显示明文密码(如忘记密码功能只发送重置链接,不发送原密码)。
- 对于内部系统密码(如数据库密码),立即更换所有受影响账户的密码。
技术整改方案(核心措施)
用户密码:强制使用哈希加盐存储
禁止使用MD5、SHA-1等简单哈希(可被彩虹表快速破解)。 推荐算法(根据安全性从高到低):
- 首选:bcrypt(成本因子建议≥10)、scrypt、Argon2(新一代,需库支持)。
- 次选:PBKDF2(迭代次数至少10000次以上)。
- 操作:
- 用户注册/修改密码时:
存储值 = BCrypt.hash(密码, salt) - 用户登录时:
BCrypt.verify(输入密码, 存储值)
- 用户注册/修改密码时:
- 注意:不要自己实现加盐逻辑,使用成熟库(如Python的
bcrypt、Java的Spring Security、Node.js的bcryptjs)。
应用配置密码:使用加密存储或密钥管理服务
- 禁止硬编码:密码(如数据库连接密码、第三方API密钥)不得出现在代码、配置文件、环境变量明文里。
- 推荐方案:
- 密钥管理服务(KMS):云厂商的KMS(如AWS KMS、阿里云KMS),调用API获取解密后的临时密码。
- 加密配置文件:使用AES-256加密配置项,应用启动时通过密钥解密(密钥由安全环境变量提供)。
- 钱包式管理:使用Hashicorp Vault等工具集中管理密文,应用通过token动态获取。
日志与传输:全程脱敏
- 日志记录:禁止打印密码、token、身份证号等敏感信息,使用日志过滤器(如Log4j2的
RegexReplaceing)或中间件将密码替换为。 - 传输加密:强制使用HTTPS/TLS 1.2+,避免密码在网络传输时被抓包,前端表单提交时,可使用JavaScript对密码进行非对称加密(如公钥加密,后端私钥解密)。
代码与架构整改
数据库字段改造
- 如果原字段是
varchar(100),BCrypt哈希输出长度为60,务必扩展字段(如varchar(256))。 - 如果旧数据是明文,必须逐条进行迁移(不能直接覆盖,需要用户主动重置或通过一次安全的批量密码哈希升级流程)。
接口与API设计
- 登录接口:限制失败尝试次数(防止暴力破解)。
- 密码修改:必须验证旧密码,且新密码不能与前几次历史密码相同(需存储历史哈希)。
- 重置密码:使用带时效的一次性token(如JWT或随机链接),发送到已验证的邮箱/手机,绝对不允许通过接口返回明文密码。
管理与流程整改
密码策略强化
- 复杂度:要求至少8位,包含大小写字母、数字、特殊字符。
- 定期更换:针对内部系统(如运维后台、数据库),强制90天或更短更换周期;用户系统建议取消定期更换(降低用户记忆负担,防止用户写纸上)。
开发规范
- 代码审计:在CI/CD管道中加入静态代码扫描工具(如SonarQube、Semgrep),检测硬编码密码。
- 培训:要求开发人员禁用
print(password),不得将密码字段传给前端(除登录时的密码字段外,其他接口返回数据时均脱敏)。 - 测试环境:使用虚拟密码(如
test123等)替代真实密码,避免泄露。
执行步骤示例(针对用户系统)
- 备份:备份所有明文密码数据库(仅用于应急回滚)。
- 脚本迁移:
- 新建字段
password_hash(varchar(256))。 - 遍历旧表,对每个明文密码使用bcrypt生成哈希,写入新字段。
- 关键:迁移后,立刻标记所有旧密码用户为“需重置”(登录时判断:若密码字段仍为明文,则要求用户通过邮箱/手机验证后立即修改密码)。
- 新建字段
- 切换验证逻辑:登录验证代码改为优先验证
password_hash字段;若没匹配,再验证旧明文字段(但立即提示用户升级)。 - 废弃旧字段:等所有用户完成密码升级(或经过一个重置周期1个月后),删除旧的明文字段。
- 日志清理:检查并清理所有可能含有明文密码的日志文件(包括系统日志、错误日志)。
长期防护
- 定期渗透测试:专门检查密码存储漏洞。
- 使用密码管理器:内部运维系统禁止人工记住密码,使用Bitwarden、1Password等管理。
- 零信任架构:即使密码被泄露,结合多因素认证(MFA)来兜底。
总结一句话:立即使所有密码哈希化(推荐bcrypt),停止输出明文到日志,为所有工具密码使用加密存储库,并强制用户重置暴露的密码。