Argon2哈希验证|比对密码与已编码哈希
输入密码与已有的Argon2编码哈希($argon2id$...),检测两者是否匹配。全部计算均在浏览器本地完成,不会将任何内容发送到服务器。
Argon2 哈希校验是什么
Argon2 是2015年密码哈希竞赛的优胜算法,如今**是新建系统最受推荐的密码哈希**。它与 bcrypt 最大的不同,在于除计算时间外**还能调整内存用量**。GPU 与专用硬件虽擅长并行运算,却难以为每个核心分配大量内存,因此要求内存可显著抬高暴力破解的成本。
Argon2 的哈希形如 `$argon2id$v=19$m=19456,t=2,p=1$盐$哈希值`,**参数与盐都嵌在字符串之中。** 因此校验时无须另行指定参数,只要哈希与密码两样即可验证。本工具执行的正是这项校验。**所有计算都在浏览器内完成,您输入的密码与哈希绝不会被发送到服务器。**
校验的步骤
- 贴上 Argon2 哈希 把以 `$argon2id$` 开头的编码字符串原样输入。
- 输入密码 填入想要比对的明文密码。
- 执行校验 **由于算法刻意大量占用内存,处理可能需要数秒。** 这正是设计使然。
- 查看结果 会显示两者是否一致。
用好本工具的小技巧
- 验证时,请直接粘贴由Argon2哈希计算工具生成的已编码哈希(以 $argon2id$ 开头的字符串)。
- 已编码哈希中已经包含了变体类型、内存成本、迭代次数和盐值等全部信息,因此验证时无需另行指定这些参数。
- 如果哈希格式不正确(例如复制时缺漏字符或混入了换行符),系统会显示错误提示,请确认是否完整准确地复制了全文。
- 如果验证结果显示不匹配,请检查密码中是否意外包含了大小写差异或前后多余的空白字符。
这些场景会用到
验证已实现的认证流程
用已知的哈希与密码组合,确认自写的登录程序能否正确校验。
确认迁移作业
事先确认自其他系统迁来的哈希,是否能照原样通过验证。
检视参数是否妥当
从字符串中嵌入的 `m`、`t`、`p` 值,可读出设定了多高的成本。
与生成端来回验证
可确认由 Argon2 哈希生成工具产生的值,在此能被正确校验。
Argon2 的术语
- Argon2id
- Argon2 三个变种中兼顾侧信道抗性与 GPU 抗性的版本。**新建系统选它是标准做法。**
- m(内存成本)
- 以 KiB 为单位指定使用的内存量。**这正是使 Argon2 能抵御 GPU 攻击的核心参数。**
- t(时间成本)
- 迭代次数。增加它会拉长计算时间,攻击者的成本也随之上升。
- p(并行度)
- 并行处理的通道数,依服务器的核心数来设定。
- 盐
- 每次哈希都变换的随机值。**同一密码也会得到不同的哈希,从而令彩虹表攻击失效。**
- 编码哈希
- 把算法名、参数、盐与哈希值汇整为单一字符串的格式,校验所需的信息一应俱全。
常见问题
闲话 ― 为什么密码只需“比较哈希”就能完成验证
密码验证乍看之下像是“直接比较已保存的密码与输入的密码”,但实际的运作机制其实完全不同。服务器(或者像本工具这样在客户端进行处理的场景)会使用与保存时相同的算法和相同的盐值,对输入的密码重新计算一次哈希值,然后只需比较这个新计算出的结果是否与已保存的哈希值一致即可。也就是说,原始密码本身从未被直接“比较”过,仅通过哈希值之间的一致性判断就能完成验证——这正是这种方式的巧妙之处。
这一机制之所以成立,是因为像Argon2这样的哈希函数具有“确定性”(deterministic):只要输入内容、盐值和参数完全相同,就一定会得到相同的输出结果。而已编码的哈希字符串(格式为 $argon2id$v=19$m=...$salt$hash)本身就已经嵌入了计算时使用的全部盐值和参数,因此验证时无需另行指定原始参数,仅凭这一串字符本身就足以完成完整的重新计算。
也正是因为具备“单向性”(无法从哈希值反向推算出原始密码)和“确定性”(相同输入必得相同输出)这两个特性,服务运营方才能够完全不保存用户的原始密码,同时依然能够在登录时安全地完成验证。即使数据库不幸遭到泄露,攻击者所能获得的也只是哈希值而已,而对于像Argon2这样计算成本很高的算法来说,想要靠暴力破解还原出原始密码,往往需要耗费极其漫长的时间——这也是它至今仍被广泛信赖的原因。