功能说明
bcrypt 是专门设计得很慢的密码哈希函数。MD5、SHA-256 每秒能算数十亿次,而 bcrypt 有可调的成本参数,让偷走数据库的攻击者每猜一次都代价高昂。它和 Argon2、scrypt 一样,至今仍是存储密码最常用的选择之一。
本工具有两个功能:
- 生成哈希:按你选择的成本和版本前缀,把密码转成 bcrypt 哈希。
- 校验:检查密码是否与已有的 bcrypt 哈希匹配,比如数据库里或框架种子文件中的哈希。
使用方法
- 输入密码,或点击示例。
- 在生成哈希模式下选择成本和版本,哈希立即生成;点击换个盐值可以得到另一个。
- 在校验模式下粘贴要校验的 bcrypt 哈希,结果会显示密码是否匹配。
看懂 bcrypt 哈希
像 $2b$10$./3kakECWB0QfIgYzIqciuv449HNnwGbgExtJQQwQ1MofonthOdoK 这样的哈希由四部分组成:版本 2b、成本 10(2¹⁰ 轮密钥设置)、22 个字符的盐值和 31 个字符的校验值。服务器以后校验密码所需的一切都在这一个字符串里,所以只需要存储哈希。
需要了解的限制
bcrypt 只读取密码的前 72 个字节。更长的密码,或者包含很多非 ASCII 字符的密码(UTF-8 中每个字符占 2–4 个字节),会被悄悄截断,出现这种情况时工具会提示。如果要支持很长的口令,可以先做一次预哈希,或考虑 Argon2id。
常见问题
› 为什么同一个密码每次生成的哈希都不一样?
每次哈希都使用新的 16 字节随机盐值,盐值就保存在哈希字符串里。这是有意为之,让相同的密码不会得到相同的哈希。要校验密码,请用「校验」模式,不要直接比较哈希字符串。
› 成本应该选多少?
选择服务器每次登录承受得起的最高成本,目前一般是 10 到 12。每加 1 工作量翻倍。请在生产硬件上实测,单次哈希约 100–300 毫秒是常见目标。
› $2a$、$2b$ 和 $2y$ 有什么区别?
算法相同。$2b$ 是 OpenBSD 当前的前缀,$2y$ 是 PHP password_hash 写出的前缀,$2a$ 是较早的版本。大多数库三种都接受,选你的系统需要的那种即可。
› 我的密码会被发送出去吗?
不会。哈希和校验都在浏览器中完成。密码和要校验的哈希只保存在当前页面的内存里,不会保存,也不会加入分享链接。