首页/安全/加密与证书速查/Argon2 口令散列
加密算法基础95 条

Argon2 口令散列

PHC 竞赛优胜方案并经 RFC 9106 标准化,含 Argon2d/i/id 三种变体;Argon2id 兼顾侧信道与 GPU 抵抗能力,是口令存储的推荐方案之一。

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

Argon2 是什么

Argon2 是密码散列竞赛(PHC)的获胜方案,并由 RFC 9106 标准化。它有三个变体:Argon2d 抵抗 GPU 但存在侧信道风险,Argon2i 侧重抵抗侧信道,Argon2id 混合两者并结合时间与内存开销参数,是口令存储的推荐选择。与 PBKDF2 相比,它把内存消耗也变成攻击成本,显著抬高并行破解的硬件门槛。

基本信息

标准RFC 9106
变体Argon2d(抗 GPU)、Argon2i(抗侧信道)、Argon2id(混合,推荐)
关键参数内存大小(KiB)、迭代次数、并行度、盐与输出长度
参考参数按 OWASP 建议可用内存 19 MiB 配 2 次迭代,或 46 MiB 配 1 次迭代
盐每用户随机,通常 16 字节
编码格式结果自带算法与参数前缀,便于识别与升级

典型使用场景

  • 新项目口令存储:默认选择 Argon2id,参数按硬件实测确定
  • 老系统迁移:从 MD5/SHA-1 迁移时在登录成功后重算并覆盖
  • 高安全要求场景:金融与政务系统的口令与密钥保护
  • 密钥派生:从业内口令派生保护密钥库的密钥
  • 合规整改:等保与行业规范要求采用内存硬方案时的首选

Python 示例(argon2-cffi)

Python 示例(argon2-cffi)
from argon2 import PasswordHasher
# memory_cost 单位为 KiB:19456 约等于 19 MiB
ph = PasswordHasher(time_cost=2, memory_cost=19456, parallelism=1)
h = ph.hash('password')      # 结果形如 $argon2id$v=19$m=19456,t=2,p=1$...
print(h)
# 校验:失败抛异常,成功可返回是否需要按新参数重算
ph.verify(h, 'password')
ph.check_needs_rehash(h)     # 参数升级后可据此触发重算

参数含义与影响

参数含义调整影响
memory_cost使用的内存,单位 KiB提高会显著增加攻击成本,也占用服务端内存
time_cost迭代次数提高会增加单次验证耗时,影响登录延迟
parallelism并行度(线程数)与硬件核数相关,过高在共享环境会互相影响
salt随机盐防彩虹表,必须每用户唯一
hash_len输出长度一般为 32 字节,需与存储字段长度匹配
散列字符串自带算法与参数(如 m=19456,t=2,p=1),因此参数升级可平滑进行:校验成功后判断是否需要重算,用新参数重新生成并覆盖即可,不必强制全员改密。
参数要按实际硬件与并发量实测再定:内存参数设置过高会在登录高峰把服务端内存吃满,反而造成可用性问题。上线前用压测确认单位时间可处理的验证次数,并预留足够余量。

易错点

  • 把 memory_cost 的单位当成字节:它是 KiB,写成 19456 表示约 19 MiB,按字节理解会得到错误的安全与资源评估
  • 在服务端选择 Argon2d:该变体对侧信道不友好,共享环境与不可信输入场景应使用 Argon2id
  • 参数设置一次性写死:无法随硬件升级调整,且难以为老用户重新计算
  • 内存参数过高导致登录接口被拖垮:高并发下会产生内存争用与超时,需要压测后再定
  • 迁移时直接替换算法:老用户无法登录,应采用登录时重算的渐进式迁移

数据来源与参考

  • RFC 9106(Argon2)
  • OWASP Password Storage Cheat Sheet
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌