Argon2哈希计算|支持Argon2id・Argon2i・Argon2d
输入密码等字符串即可计算Argon2哈希值。支持Argon2id、Argon2i、Argon2d三种方式,并可选择OWASP推荐的内存开销・迭代次数预设。全部计算均在浏览器内完成,输入内容不会发送到服务器。
什么是 Argon2 哈希计算
Argon2 哈希计算是只需输入密码等字符串,即可以 Argon2id・Argon2i・Argon2d 三种方式之一生成哈希值的工具。作为密码哈希竞赛(PHC)优胜算法的 Argon2,不仅能抵御单纯的暴力破解,对 GPU、ASIC 等专用硬件发起的高速攻击同样强韧,因此被广泛作为新开发系统中保存密码的首选。
哈希的强度由内存开销、迭代次数、并行度三个参数决定,取值越大攻击者的计算成本越高,但正规登录处理所需的时间与内存也会同时增加。本工具可选择 OWASP Password Storage Cheat Sheet 推荐的五种组合作为预设,建议先试其中一种,再依实际运行服务器的性能加以调整。
Argon2 哈希计算的使用方法
- 输入密码(字符串) 在“密码(字符串)”栏中输入想要哈希化的字符串。输入内容不会发送至外部。
- 选择变体 若无特别理由,请选择兼顾 GPU 抗性与侧信道抗性的“Argon2id(推荐)”。
- 套用 OWASP 推荐预设 按下预设按钮后,内存开销、迭代次数、并行度会自动设为 OWASP 推荐的组合。
- 如有需要可分别调整参数 内存开销(KiB)、迭代次数、并行度可在数值栏中直接编辑。取值越大计算时间越长。
- 按下“计算哈希”确认结果 会显示 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=... 。
常见问题
password_verify()或其他语言的Argon2验证库进行校验。不过请务必妥善处理输入内容。
闲话 ― 密码哈希竞赛与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。