Argon2哈希计算|支持Argon2id・Argon2i・Argon2d

输入密码等字符串即可计算Argon2哈希值。支持Argon2id、Argon2i、Argon2d三种方式,并可选择OWASP推荐的内存开销・迭代次数预设。全部计算均在浏览器内完成,输入内容不会发送到服务器。

什么是 Argon2 哈希计算

Argon2 哈希计算是只需输入密码等字符串,即可以 Argon2id・Argon2i・Argon2d 三种方式之一生成哈希值的工具。作为密码哈希竞赛(PHC)优胜算法的 Argon2,不仅能抵御单纯的暴力破解,对 GPU、ASIC 等专用硬件发起的高速攻击同样强韧,因此被广泛作为新开发系统中保存密码的首选。

哈希的强度由内存开销、迭代次数、并行度三个参数决定,取值越大攻击者的计算成本越高,但正规登录处理所需的时间与内存也会同时增加。本工具可选择 OWASP Password Storage Cheat Sheet 推荐的五种组合作为预设,建议先试其中一种,再依实际运行服务器的性能加以调整。

Argon2 哈希计算的使用方法

  1. 输入密码(字符串) 在“密码(字符串)”栏中输入想要哈希化的字符串。输入内容不会发送至外部。
  2. 选择变体 若无特别理由,请选择兼顾 GPU 抗性与侧信道抗性的“Argon2id(推荐)”。
  3. 套用 OWASP 推荐预设 按下预设按钮后,内存开销、迭代次数、并行度会自动设为 OWASP 推荐的组合。
  4. 如有需要可分别调整参数 内存开销(KiB)、迭代次数、并行度可在数值栏中直接编辑。取值越大计算时间越长。
  5. 按下“计算哈希”确认结果 会显示 PHC 格式的编码后哈希,以及实际所花的计算时间。可用复制按钮留存结果。

用好本工具的小技巧

  • Argon2 是2015年“密码哈希竞赛”(Password Hashing Competition)的优胜算法,其中Argon2id是OWASP目前推荐的方式。若无特殊理由,建议选择Argon2id。
  • 预设按钮对应OWASP密码存储备忘单(Password Storage Cheat Sheet)推荐的5种内存开销・迭代次数组合。内存开销越大,对GPU并行破解的抵抗力越强。
  • 提高“并行度(p)”在浏览器端的WebAssembly实现中并不会真正并行处理,计算耗时几乎不变。并行度带来的加速仅在多核服务器环境下才有效。
  • 盐值会在每次计算时自动重新生成,因此即使是相同的字符串和参数,每次输出的完整哈希编码也不同。
  • 将内存开销设置得过大时,浏览器标签页可能会暂时无响应。建议先从几十MB左右开始尝试。

Argon2 哈希计算的应用场景

研究新服务的密码保存方式

在为新建系统研究如何保存密码时,可当场确认实际的哈希长度以及各参数下的计算时间。

构建 API 密钥、令牌的安全保管形式

不限于登录密码,若希望把 API 密钥或共享密钥这类机密字符串哈希化后保存、而非以明文置于数据库,同样可以使用。

准备开发、测试用的虚拟哈希

无需启动应用,即可在此生成用于直接写入数据库的测试账号哈希值。

体感内存开销、迭代次数与计算时间的关系

改变参数计算数次并对比结果中的“计算时间”栏,可作为判断适合生产服务器设置的依据。

研究由既有系统的 BCrypt 迁移

把同一字符串也用BCrypt 哈希计算生成,比较输出格式与所需时间,可作为迁移的判断材料。

Argon2 哈希计算相关术语

Argon2id
兼具 Argon2d 与 Argon2i 两者性质的混合方式。同时具备对 GPU 攻击与侧信道攻击的抗性,OWASP 将其列为首要推荐。
Argon2i
内存访问顺序不依赖于输入的方式,对侧信道攻击(从执行时间或电力消耗读取信息的攻击)较强,但 GPU 抗性略逊于 Argon2d。
Argon2d
内存访问顺序依赖于输入的方式,对 GPU 或 ASIC 的并行攻击抗性最高,但具有易受侧信道攻击的特点。
内存开销
以 KiB 为单位指定哈希计算所用内存量的参数。取值越大,专用硬件并行攻击的成本越高。
迭代次数
亦称“时间开销”,用于指定内部处理重复多少次的参数。取值越大计算时间越长,对暴力破解的抗性也越高。
并行度
指定并行执行计算的通道数的参数。在服务器的多核环境下有助于提速,但在浏览器上的 WebAssembly 实现中不起作用。
盐值
哈希化之前附加的随机值。本工具在每次计算时自动生成,因此即便字符串与参数相同,每次输出的哈希也不相同。
PHC 格式
由密码哈希竞赛制定的、把算法名、版本、参数、盐值与哈希本体汇总为一条字符串的编码格式,形如 $argon2id$v=19$m=... 。

常见问题

如果是新开发的系统,Argon2id是首选方案,OWASP目前也将Argon2id列为第一推荐。不过如果现有系统已在使用BCrypt,迁移时需要注意重新计算哈希(例如在下次登录时重新哈希)。

Argon2d 对GPU攻击的抵抗力最强,但容易受到侧信道攻击;Argon2i 则相反。Argon2id 是结合两者设计的混合方案,若无特殊理由,建议优先选择Argon2id。

本工具的预设按钮对应OWASP密码存储备忘单推荐的5种组合。如果要在服务器上实际使用,建议以单次哈希计算耗时100〜500毫秒左右为目标,并结合可用内存进行调整。

可以。由于使用的是标准Argon2算法,生成的哈希值可以直接通过PHP的password_verify()或其他语言的Argon2验证库进行校验。不过请务必妥善处理输入内容。

不会。哈希计算全部在浏览器内的WebAssembly中完成,输入内容不会被发送到任何外部服务器。
工具君

闲话 ― 密码哈希竞赛与Argon2的诞生背景

Argon2 是在2013年至2015年举办的“密码哈希竞赛(Password Hashing Competition, PHC)”中,从24个参赛方案中脱颖而出、被选为最优算法的成果。这场竞赛之所以举办,正是因为BCrypt(1999年)、PBKDF2(2000年)等既有方式存在一个共同弱点——容易被GPU、ASIC等专用硬件加速暴力破解。为了克服这一弱点,Argon2 在设计上刻意要求计算过程消耗大量内存,让专用硬件的并行优势难以发挥。

有趣的是,Argon2 并非只有一种形态,而是共有3种变体,各自的取舍也不尽相同。Argon2d对GPU攻击的抵抗力最强,但容易受到侧信道攻击;Argon2i则正好相反,能较好抵御侧信道攻击,但GPU抵抗力略逊一筹。而Argon2id正是结合两者优点的混合方案,这也是OWASP等众多安全机构都将其列为密码存储首选算法的原因。

也正因为如此,Argon2id 如今已逐渐成为新系统的标准配置。PHP 自7.2版本起,只需在password_hash()函数中指定PASSWORD_ARGON2ID常量即可生成对应哈希;Node.js、Python、Ruby等主流语言也都提供了官方或准官方的库支持。可以说,在新开发的系统中,越来越多的开发者已经把Argon2id当作密码存储的第一选择,而不再是曾经的主流BCrypt。