跳转到主要内容

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 作为获胜算法。

三种变体

Argon2d

使用数据相关的内存访问模式。对 GPU 攻击的抗性最高,但易受侧信道攻击。适用于加密货币挖矿等服务器端用途。

Argon2i

使用与数据无关的内存访问模式。对侧信道攻击具有抗性,但 GPU 抗性不及 Argon2d。适合在共享环境中使用。

Argon2id (推荐)

Argon2d 与 Argon2i 的混合方案。前半部分采用 Argon2i 方式确保侧信道抗性,后半部分采用 Argon2d 方式发挥 GPU 抗性。是密码哈希的标准选择。

内存硬函数的意义

传统哈希函数仅依赖 CPU 的计算速度,因此在拥有数千核心的 GPU 上并行计算便可高速实施暴力破解攻击。内存硬函数通过要求计算消耗大量内存来解决这一问题。 GPU 虽然运算核心众多,但每个核心的内存有限,因此难以并行执行大量消耗内存的算法。对于使用 ASIC (专用硬件) 的攻击,搭载大容量内存成本高昂,也降低了攻击的经济合理性。

与 bcrypt、scrypt 的比较

特性bcryptscryptArgon2id
问世年份199920092015
内存硬
GPU 抗性
参数调整仅成本CPU + 内存 + 并行度CPU + 内存 + 并行度
输入长度限制72 字节
OWASP 推荐排名第 2 位第 3 位第 1 位

参数设计

Argon2id 的性能由内存量、迭代次数 (time cost)、并行度 (parallelism) 三个参数控制。 OWASP 截至 2025 年的推荐设置如下。

内存: 19 MiB (19456 KiB)
迭代次数: 2
并行度: 1
长: 16 字节以上
哈希长: 32 字节以上

内存量越大,安全性越高,但服务器的资源消耗也会增加。在将登录处理延迟控制在 1 秒以内的范围内,尽可能多地分配内存,是实务上的平衡之道。关于安全保存密码方法的全貌,在安全的密码管理指南中有详细说明。密码技术与安全专业书 (Amazon)可进一步深入学习。

常见误解

有人说「Argon2 太慢了,不想用」,但慢正是其设计意图。密码哈希通过刻意放慢速度来限制攻击者的尝试速度。正规用户只需登录一次,而攻击者需要数亿次尝试,因此每次的成本越高,防御效果就越大。对于彩虹表攻击,通过盐与内存硬的组合也能进行牢固的防御。关于密码学的基础知识,也可参考加密基础这篇文章。

相关术语

这篇文章对您有帮助吗?

XHatena