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),因此参数升级可平滑进行:校验成功后判断是否需要重算,用新参数重新生成并覆盖即可,不必强制全员改密。
参数要按实际硬件与并发量实测再定:内存参数设置过高会在登录高峰把服务端内存吃满,反而造成可用性问题。上线前用压测确认单位时间可处理的验证次数,并预留足够余量。