bcrypt 哈希生成器
生成哈希
数值越高越慢,也更安全。12 是不错的默认值。
有时你会从旧备份里拿到一个 bcrypt 哈希和一个明文密码,需要确认它们是否匹配。或者你有一个密码,想知道在给定的成本因子(cost)下会生成什么哈希。这个工具两件事都能做:输入密码即可生成新哈希;粘贴哈希和候选密码,它会告诉你验证是否成功,使用与生产环境登录检查相同的恒定时间比较。
生成或验证 bcrypt
-
1
选择模式
从密码生成新哈希,或用密码验证已有的 `$2a$` / `$2b$` / `$2y$` 哈希。
-
2
生成模式:输入明文和 cost
cost 取值 4-14;10-12 为常见范围。每个哈希都会生成一个 16 字节的随机盐(salt)。
-
3
验证模式:粘贴哈希和明文
工具会从哈希中提取盐和 cost,并用相同参数重新哈希明文。
-
4
读取结果
生成模式复制 60 个字符的哈希;验证模式返回绿色的匹配或红色的不匹配。
验证模式内部逻辑
给定一个存储的 hash,例如:
$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6
验证器会:
- 解析版本(
2b)、cost(12)、盐(cost 之后的前 22 个字符)和摘要(最后 31 个字符)。 - 使用提取出的盐和 cost,对候选明文重新运行 bcrypt。
- 用恒定时间比较,将得到的摘要与原始值进行比较。
比较成功得到 true;任何差异都会得到 false。
恒定时间比较
用简单的 == 比较两个字符串,会在第一个不同的字节处立刻返回,这是一种计时侧信道,在样本足够多时可能逐位泄露哈希。生产环境的密码检查(以及这个工具)使用恒定时间比较,它始终检查每一个字节,因此判定时间不取决于前面有多少个字节匹配。
常见诊断场景
| 症状 | 可能原因 |
|---|---|
| 验证失败,但你确信密码正确 | 输入末尾有多余空白或 BOM。两者都去掉。 |
验证失败,版本为 2y |
某些库不喜欢 2y;它有效且兼容。今后改用 2b 重新哈希。 |
| 哈希太短 / 格式错误 | 这不是 bcrypt 哈希。MD5 是 32 个十六进制字符,SHA-1 是 40 个,bcrypt 是带 $ 分隔符的 60 个字符。 |
| cost 不匹配警告 | 存储的 cost 低于你的策略下限。下次成功登录时重新哈希。 |
登录时重新哈希
最佳实践:用户成功登录后,检查已存储哈希的 cost 是否低于当前策略。如果低,就用新的 cost 重新哈希密码并更新数据库。几个月内,你就能在不要求任何人修改密码的情况下,升级整个用户群的哈希。
这个工具不会做什么
- 批量验证 — 本工具一次只处理一个哈希。
- 破解或暴力穷举 — 字典攻击或彩虹表攻击有意不在支持范围内。
- 还原明文 — bcrypt 是单向的;如果忘记密码,唯一的办法是重置。
常见问题
不会。哈希和验证都在你的浏览器中完成。明文和哈希都不会离开页面。
每个哈希的盐都是随机生成的。这正是它的意义所在 —— 两个用户即使使用相同密码也会得到不同的哈希,从而让彩虹表失效。
可以,这正是验证模式的用途:粘贴你已有的哈希,再粘贴候选密码,工具会确认或否定二者是否匹配。
支持。所有现代变体都能互操作 —— 摘要在不同版本间兼容,区别只在于标签。少数来自 2000 年代系统的旧 $2$ 哈希,可能需要一个显式支持旧格式的库。
相关工具
Atbash 密码编码器
使用 Atbash 密码编码或解码文本,这是一种把 A-Z 映射为 Z-A 的希伯来替换法。同一个操作既可加密也可解密。
AES 加密 / 解密
使用 OpenSSL AES cipher 加密和解密低风险文本。口令会用 SHA-256 哈希,Base64 输出包含 IV 加密文。
A1Z26 密码编码器
使用 A1Z26 密码(A=1, B=2, ... Z=26)编码文本,或把数字序列解码回字母,并可自定义分隔符。
Base32 编码器和解码器
使用 RFC 4648 字母表编码和解码 Base32 字符串。适用于 TOTP 密钥、大小写不敏感的令牌和人工输入的标识符。
Base85 编码器和解码器
编码和解码 Adobe Ascii85(PostScript/PDF)或 Z85(ZeroMQ)变体的 Base85。对二进制数据比 Base64 更紧凑。
bcrypt 生成器
从 plaintext password 生成 bcrypt hash。Cost factor 可在 4 到 14 之间调整,兼容 Laravel、Django、Node 和 PHP。