跳到正文

bcrypt 与 argon2 校验

bcrypt & argon2 Checker

用指定 cost 对密码做 bcrypt 哈希,并把密码和现有的 bcrypt 哈希比对;argon2 认得出来但不计算。

用 bcrypt 给密码做哈希,或者把密码和一个现有的 `$2a$`/`$2b$`/`$2y$` 哈希比对。实现是 OpenBSD 的 `$2b$`,用公开的 Openwall crypt_blowfish 测试向量验证过,在这个标签页的 worker 里运行。

🔒 完全在你的浏览器里运行bcryptargon2passwordhash
模式

只在这个标签页里处理,不往外发送。

代价

1,024 轮 — 沿用已久的默认值。

这就是 OpenBSD 定义的 $2b$ 那种 bcrypt,对照公开的 Openwall crypt_blowfish 测试向量验证过,全部在这个标签页里运行。密码只有前 72 字节算数——这是 bcrypt 就如此,不是这里的缺陷。 $2x$ 哈希(由 2011 年之前的 crypt_blowfish 缺陷造成)会被拒绝,argon2 也没有实现。

怎么用

  1. 选哈希还是校验

    哈希需要一个 cost;校验从你粘贴的哈希里读出 cost,因为它就存在那个字符串里。

  2. 选一个你负担得起的 cost

    每加一级工作量翻倍。10 当了很多年的默认值,12 是当前扎实的选择,14 在浏览器里要花几秒钟能感觉到——这正是意义所在:攻击者也要花那么久。

  3. 读结论

    匹配或不匹配。一切都在标签页里发生,所以粘到这里的生产环境哈希不会去往任何地方。

常见问题

为什么 argon2 是被拒绝而不是被支持?

因为浏览器里一个可信的 argon2 意味着要带上一份这个项目无法逐行审计的 WebAssembly 构建。bcrypt 在这里是用你能读的代码实现的,并用公开向量核对过。拒绝一个 argon2 哈希,比从黑盒里给出一个看起来像样的答案更诚实。

为什么我的长密码能和错的哈希匹配上?

bcrypt 只读前 72 个字节。前 72 个字节相同的两个密码对它来说是同一个密码——这是 bcrypt 本身,不是这个实现。它对长口令有影响,也是人们转向 argon2 的一个原因。

为什么同一个密码哈希两次得到不同的字符串?

因为每次运行都生成一个新的 16 字节盐,盐随哈希一起存放。两个字符串都能校验同一个密码。每次都一样的密码哈希是没有盐的密码哈希,彩虹表正是为它造的。

$2a$、$2b$ 和 $2y$ 不同吗?

对任何 72 字节以内的密码——也就是所有密码——没有区别。这些前缀记录的是一个哈希在某个历史 bug 之前还是之后生成。`$2x$` 是例外——它标记 2011 年前 crypt_blowfish 一个 bug 产生的哈希,这里会拒绝它们。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。