首页/安全/等保与合规速查/口令存储:不可逆、加盐、慢哈希
密码与认证合规50 条

口令存储:不可逆、加盐、慢哈希

口令必须以不可逆方式存储:加盐并采用慢哈希(PBKDF2、bcrypt、scrypt、Argon2),防止拖库后离线破解与彩虹表攻击。

等保与合规速查安全更新于 2026-10-13

口令存储是什么问题

口令存储指系统如何保存用户登录凭据。正确做法是只存不可逆的派生值:为每个用户生成随机盐,选用 PBKDF2、bcrypt、scrypt 或 Argon2 这类可调计算成本的慢哈希,把盐与结果一起存储。这样即使数据库被拖走,攻击者也难以批量还原明文口令。

基本信息

原则不可逆、每用户独立随机盐、计算成本可调
推荐算法PBKDF2、bcrypt、scrypt、Argon2(按合规与依赖条件选择)
参数方向迭代次数或内存成本随硬件升级定期上调
禁止做法明文、可逆加密、MD5/SHA1 裸哈希、全库共用同一盐
存储内容算法标识 + 参数 + 盐 + 派生值,便于后续平滑升级
参考OWASP 密码存储备忘单

典型使用场景

  • 新系统设计数据库表结构时确定凭据字段的存储形式
  • 存量系统改造,把老哈希在用户下次登录时透明升级为新算法
  • 等保与个人信息合规检查中说明鉴别信息保护措施
  • 代码审计时排查是否使用 MD5 或可逆加密保存口令
  • 运维侧与应用侧口令分离管理,禁止共用同一口令

PBKDF2 示例

PBKDF2 示例
import os, hashlib, base64
salt = os.urandom(16)
dk = hashlib.pbkdf2_hmac('sha256', b'user-password', salt, 600000)
store = base64.b64encode(salt + dk)   # 存储 salt+dk,不存明文
# 迭代次数取行业建议量级,并随硬件升级与安全评估调整
# 校验时用同一盐重新派生,再做定长比较(避免时序泄露)

存储方式对照

存储方式风险结论
明文或可逆加密库被读取即可直接获得全部口令禁止使用
MD5 / SHA1 裸哈希彩虹表与 GPU 暴力破解成本极低禁止使用
固定盐哈希同口令用户哈希相同,一次破解批量命中不可接受
PBKDF2 高迭代需大量计算才能尝试单一口令推荐
Argon2 等内存硬算法抗 GPU 与 ASIC 能力更强优先推荐
参考 OWASP 密码存储备忘单:PBKDF2-HMAC-SHA256 建议数十万次迭代量级;在合规允许范围内优先选用抗 GPU 的 Argon2 类算法,并把参数写入配置便于统一调整。
算法升级的平滑路径:存储结构中带算法与参数标识,用户登录成功时用新算法重新派生并覆盖旧值,无需强制全员改密。

易错点

  • MD5 / SHA1 裸哈希:可被彩虹表与 GPU 快速破解,等价于未保护
  • 加盐值全库相同:同口令用户哈希相同,破解成本被摊薄
  • 把口令写入日志或错误堆栈:日志集中留存后被检索到,保护前功尽弃
  • 校验时使用普通字符串比较:时序差异可被利用逐字节猜测口令派生值
  • 迭代次数十年不变:硬件换代后原有成本假设不再成立

数据来源与参考

  • OWASP Password Storage Cheat Sheet
  • GB/T 39786-2021(身份鉴别相关要求)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌