首页/安全/加密与证书速查/口令存储方案选型
加密算法基础95 条

口令存储方案选型

现代口令存储可在 Argon2id、scrypt、bcrypt、PBKDF2 之间按环境能力选择,并设计参数升级策略;明文存储或单轮哈希不满足基本要求。

加密与证书速查安全更新于 2026-10-13

口令存储怎么选

口令存储的目标是让攻击者拿到数据库后也无法低成本还原口令:必须使用带盐、故意变慢的抗暴力破解算法,并设计参数升级路径。现代方案可在 Argon2id、scrypt、bcrypt 与 PBKDF2 之间按环境与合规要求选择;明文存储、可逆加密或单轮哈希都不满足基本要求。

基本信息

首选方案Argon2id(RFC 9106)
备选方案scrypt(RFC 7914)、bcrypt、PBKDF2(合规场景常见)
必要属性每用户唯一盐、可配置工作因子、算法与参数随散列存储
禁止做法明文、可逆加密、单轮 MD5/SHA-1/SHA-256
迁移方式登录成功后按新参数重算并覆盖,渐进式升级
识别方式散列前缀,如 $argon2id$、$2b$、$5$、$6$

典型使用场景

  • 新系统建库:直接采用 Argon2id 并实测可用参数
  • 老系统整改:把 MD5、SHA-1 或极低迭代 PBKDF2 存量升级
  • 合规自查:等保与行业规范对口令存储有明确要求
  • 多系统统一:内部多个应用统一算法与参数,降低维护成本
  • 审计取证:判断现有存储方案是否具备抗离线爆破能力

渐进式升级思路(伪代码)

渐进式升级思路(伪代码)
login(user, pw):
  h = load_hash(user)                      # 散列中带算法与参数
  if not verify(pw, h): return fail        # 校验失败统一返回
  if is_legacy(h) or needs_rehash(h):      # 老算法或参数低于当前标准
      store_hash(user, hash(pw))           # 用新参数重算并覆盖
  return ok
# 特点:用户无需改密,迁移随登录自然完成,可长期运行

方案对照

方案抗 GPU 能力关键参数备注
Argon2id强内存与迭代可调,如 19-46 MiB 配 1-2 次迭代新项目优先
scrypt强N、r、p 三个参数需同时评估库支持情况需确认
bcrypt中cost 10 及以上输入长度上限 72 字节
PBKDF2中偏弱SHA-256 迭代次数按当前建议设置合规场景常见
单轮 SHA-256 或 MD5无-不可用于口令存储
迁移依赖散列前缀识别算法:老系统的 $1$(MD5-crypt)、$2b$(bcrypt)、$5$/$6$(SHA-256/512-crypt)与新系统的 $argon2id$ 需要能同时校验。保留旧算法标识,才能实现「老用户照常登录、登录后自动升级」。
不要用「加固定前缀或加固定盐」冒充安全增强:固定值可读即无秘密,真正的防护来自算法选择与参数强度。同时警惕把口令加密后存库的做法,密钥泄漏即可批量还原口令。

易错点

  • 给散列加固定前缀或固定盐:看起来复杂了,实际没有任何熵增量,离线爆破成本不变
  • 升级算法时一次性重置全员口令:引发大量用户投诉与客服压力,应改为登录时重算
  • 使用可逆加密存储口令:密钥与数据库同时泄漏即可批量还原全部口令
  • 忽略参数升级:算法选对了但工作因子多年未调,硬件进步后防护能力实际下降
  • 多系统各自选择不同方案且无统一策略:运维复杂度上升,容易出现某个系统成为最弱一环

数据来源与参考

  • OWASP Password Storage Cheat Sheet
  • RFC 9106
  • RFC 7914
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌