Argon2
本文约需 2 分钟阅读
Argon2 是在 2015 年的 Password Hashing Competition (PHC) 中夺冠的密码哈希函数。它被设计为内存硬 (memory-hard) 函数,对 GPU 和 ASIC 的并行攻击具有很高的抗性。截至 2025 年,它是 OWASP 最为推荐的密码哈希算法,也是新系统存储密码时的首选。
历史背景
密码哈希的历史是与攻击者硬件演进的一场追逐战。从 Unix 的 crypt (1976 年) 开始,bcrypt (1999 年) 引入了成本因子 (cost factor) 的概念。但 bcrypt 是 CPU 密集型的,无法充分对抗 GPU 的大规模并行处理。 scrypt (2009 年) 引入了内存硬的概念,但参数设计的难度成为课题。在这样的背景下, 2013 年举办了 PHC,从 24 个候选方案中选出 Argon2 作为获胜算法。
三种变体
使用数据相关的内存访问模式。对 GPU 攻击的抗性最高,但易受侧信道攻击。适用于加密货币挖矿等服务器端用途。
使用与数据无关的内存访问模式。对侧信道攻击具有抗性,但 GPU 抗性不及 Argon2d。适合在共享环境中使用。
Argon2d 与 Argon2i 的混合方案。前半部分采用 Argon2i 方式确保侧信道抗性,后半部分采用 Argon2d 方式发挥 GPU 抗性。是密码哈希的标准选择。
内存硬函数的意义
传统哈希函数仅依赖 CPU 的计算速度,因此在拥有数千核心的 GPU 上并行计算便可高速实施暴力破解攻击。内存硬函数通过要求计算消耗大量内存来解决这一问题。 GPU 虽然运算核心众多,但每个核心的内存有限,因此难以并行执行大量消耗内存的算法。对于使用 ASIC (专用硬件) 的攻击,搭载大容量内存成本高昂,也降低了攻击的经济合理性。
与 bcrypt、scrypt 的比较
| 特性 | bcrypt | scrypt | Argon2id |
|---|---|---|---|
| 问世年份 | 1999 | 2009 | 2015 |
| 内存硬 | ✗ | ✓ | ✓ |
| GPU 抗性 | 低 | 中 | 高 |
| 参数调整 | 仅成本 | CPU + 内存 + 并行度 | CPU + 内存 + 并行度 |
| 输入长度限制 | 72 字节 | 无 | 无 |
| OWASP 推荐排名 | 第 2 位 | 第 3 位 | 第 1 位 |
参数设计
Argon2id 的性能由内存量、迭代次数 (time cost)、并行度 (parallelism) 三个参数控制。 OWASP 截至 2025 年的推荐设置如下。
内存量越大,安全性越高,但服务器的资源消耗也会增加。在将登录处理延迟控制在 1 秒以内的范围内,尽可能多地分配内存,是实务上的平衡之道。关于安全保存密码方法的全貌,在安全的密码管理指南中有详细说明。密码技术与安全专业书 (Amazon)可进一步深入学习。
常见误解
有人说「Argon2 太慢了,不想用」,但慢正是其设计意图。密码哈希通过刻意放慢速度来限制攻击者的尝试速度。正规用户只需登录一次,而攻击者需要数亿次尝试,因此每次的成本越高,防御效果就越大。对于彩虹表攻击,通过盐与内存硬的组合也能进行牢固的防御。关于密码学的基础知识,也可参考加密基础这篇文章。
这篇文章对您有帮助吗?