哈希与安全

Argon2 哈希生成器

生成用于存储密码的带盐 Argon2id 哈希。

给这个工具评分

如何使用 Argon2 哈希生成器

  1. 输入您要哈希的密码。
  2. 除非有特殊理由,否则请保持变体为 Argon2id。
  3. 点击“生成”,然后将哈希复制到您的数据库中。

关于 Argon2 哈希生成器

Argon2 赢得了 2015 年密码哈希竞赛(Password Hashing Competition)的冠军,由 Alex Biryukov、Daniel Dinu 和 Dmitry Khovratovich 设计。它有三个变体。Argon2d 是数据依赖型——速度最快,但其内存访问模式取决于密码内容,可能泄露时序信息。Argon2i 是数据无关型,能够抵御侧信道攻击。Argon2id 是两者的混合体,也是普遍推荐的选择;这是 OWASP 为新应用推荐的方案,也是本工具的默认选项。

它最突出的特性是 Argon2 具备内存困难性(memory-hard)。它在哈希过程中故意占用一大块内存,而这正是它的设计核心:GPU 或 ASIC 可以塞入海量微小的并行核心,但无法低成本地为每一个核心都配备 64 MB 的高速内存。因此,攻击 Argon2 需要投入真金白银购置硬件,而攻击一个快速哈希则不需要。这正是它相较于 bcrypt 的关键优势——bcrypt 速度慢,但对内存的需求并不算高。

与 bcrypt 一样,Argon2 会自动为每次哈希加盐,所以每次运行结果不同是正常的——盐值和所有参数都编码在 $argon2id$… 字符串本身之中,这也是验证程序日后能够读取回这些信息的原因。切勿通过重新哈希并比较字符串的方式来校验密码;请改用我们的验证工具。本工具固定使用 64 MB 内存开销、4 次迭代和 1 个线程,因为这是一个公开端点,若参数不受限制,很容易被用来拖垮服务器。在你自己的服务器上,可以根据硬件情况调整开销参数。

常见问题

为什么每次点击“生成”哈希都不一样?

因为 Argon2 会为每次哈希添加一个全新的随机盐值。这是刻意为之,也正是你想要的效果——它能阻止攻击者预先计算彩虹表。对同一个密码来说,两个哈希都是有效的。要校验密码,请使用验证工具,而不是比较字符串。

Argon2id、Argon2i 还是 Argon2d?

Argon2id。它是另外两者的混合体,也是 OWASP 为新应用推荐的选择。只有在你确实需要数据无关特性时,才选择 Argon2i。

Argon2 还是 bcrypt?

目前推荐使用 Argon2id,主要因为它具备内存困难性,能让 GPU 和 ASIC 破解的成本大幅提高。bcrypt 仍然是一个可靠、经过充分检验的选项,几乎在所有地方都受支持,所以现有的 bcrypt 方案并不需要紧急更换。

我能修改内存开销或迭代次数吗?

在这里不能——出于公开端点的考虑,参数被固定为 64 MB、4 次迭代和 1 个线程。在你自己的代码中,你可以也应该调整这些参数;由于这些参数被存储在哈希字符串内部,在这里生成的哈希在任何地方仍然可以正常验证。

我的密码会被存储吗?

不会。它会被发送到我们的服务器进行哈希计算,因为浏览器无法计算 Argon2,计算完成后会立即丢弃——绝不记录,绝不存储。对于正在使用的生产密码,在自己的服务器上生成仍然是更安全的习惯。