bcrypt 哈希生成器

生成哈希

数值越高越慢,也更安全。12 是不错的默认值。

有时你会从旧备份里拿到一个 bcrypt 哈希和一个明文密码,需要确认它们是否匹配。或者你有一个密码,想知道在给定的成本因子(cost)下会生成什么哈希。这个工具两件事都能做:输入密码即可生成新哈希;粘贴哈希和候选密码,它会告诉你验证是否成功,使用与生产环境登录检查相同的恒定时间比较。

生成或验证 bcrypt

  1. 1

    选择模式

    从密码生成新哈希,或用密码验证已有的 `$2a$` / `$2b$` / `$2y$` 哈希。

  2. 2

    生成模式:输入明文和 cost

    cost 取值 4-14;10-12 为常见范围。每个哈希都会生成一个 16 字节的随机盐(salt)。

  3. 3

    验证模式:粘贴哈希和明文

    工具会从哈希中提取盐和 cost,并用相同参数重新哈希明文。

  4. 4

    读取结果

    生成模式复制 60 个字符的哈希;验证模式返回绿色的匹配或红色的不匹配。

验证模式内部逻辑

给定一个存储的 hash,例如:

$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6

验证器会:

  1. 解析版本(2b)、cost(12)、盐(cost 之后的前 22 个字符)和摘要(最后 31 个字符)。
  2. 使用提取出的盐和 cost,对候选明文重新运行 bcrypt。
  3. 用恒定时间比较,将得到的摘要与原始值进行比较。

比较成功得到 true;任何差异都会得到 false

恒定时间比较

用简单的 == 比较两个字符串,会在第一个不同的字节处立刻返回,这是一种计时侧信道,在样本足够多时可能逐位泄露哈希。生产环境的密码检查(以及这个工具)使用恒定时间比较,它始终检查每一个字节,因此判定时间不取决于前面有多少个字节匹配。

常见诊断场景

症状 可能原因
验证失败,但你确信密码正确 输入末尾有多余空白或 BOM。两者都去掉。
验证失败,版本为 2y 某些库不喜欢 2y;它有效且兼容。今后改用 2b 重新哈希。
哈希太短 / 格式错误 这不是 bcrypt 哈希。MD5 是 32 个十六进制字符,SHA-1 是 40 个,bcrypt 是带 $ 分隔符的 60 个字符。
cost 不匹配警告 存储的 cost 低于你的策略下限。下次成功登录时重新哈希。

登录时重新哈希

最佳实践:用户成功登录后,检查已存储哈希的 cost 是否低于当前策略。如果低,就用新的 cost 重新哈希密码并更新数据库。几个月内,你就能在不要求任何人修改密码的情况下,升级整个用户群的哈希。

这个工具不会做什么

  • 批量验证 — 本工具一次只处理一个哈希。
  • 破解或暴力穷举 — 字典攻击或彩虹表攻击有意不在支持范围内。
  • 还原明文 — bcrypt 是单向的;如果忘记密码,唯一的办法是重置。

常见问题

不会。哈希和验证都在你的浏览器中完成。明文和哈希都不会离开页面。

每个哈希的盐都是随机生成的。这正是它的意义所在 —— 两个用户即使使用相同密码也会得到不同的哈希,从而让彩虹表失效。

可以,这正是验证模式的用途:粘贴你已有的哈希,再粘贴候选密码,工具会确认或否定二者是否匹配。

支持。所有现代变体都能互操作 —— 摘要在不同版本间兼容,区别只在于标签。少数来自 2000 年代系统的旧 $2$ 哈希,可能需要一个显式支持旧格式的库。

相关工具