在线工具箱
Bcrypt 哈希

Bcrypt 哈希工具

生成与校验 Bcrypt 哈希,支持自定义 cost 因子(4~15)与 $2a$ / $2b$ / $2y$ 版本。

隐私安全:所有处理均在您的浏览器本地完成,数据绝不上传
Bcrypt哈希密码
🔐

Bcrypt 是单向哈希,无法「解密」

bcrypt 只能由明文计算出哈希、再由哈希校验明文,是不可逆的。请把生成的哈希(salt 已包含在其中)存入数据库,校验时粘贴完整的 60 字符哈希即可。

明文与参数

已用 0 字节 / 上限 72 字节

密钥扩展 2^10 = 1024 轮 · 预估耗时 测量中…

生成结果

工作原理

  1. 1输入要保护的明文并设置 cost 因子(4~15)。cost 每加 1,密钥扩展计算量翻倍,破解成本随之指数上升。
  2. 2工具用 crypto.getRandomValues 生成 16 字节随机盐,按 bcrypt 专用 Base64 字母表(./A-Za-z0-9)编码为 22 个字符。
  3. 3以 UTF-8 明文(末尾补 0x00)与盐为输入执行 EksBlowfish 密钥扩展:先做一次带盐的初始化,再交替进行 2^cost 轮「先密钥后盐」的扩展。
  4. 4扩展完成后用最终 P/S 表加密常量「OrpheanBeholderScryDoubt」64 轮,取 24 字节中的前 23 字节编码为 31 字符校验和,拼成 $2b$<cost>$<盐><校验和>。
  5. 5校验时用哈希中自带的盐重算校验和,并以定长时间比较判断是否匹配;cost 较高时分块计算并实时显示进度,可随时取消。

常见问题

Bcrypt 是什么?为什么适合用来存密码?

Bcrypt 是 1999 年基于 Blowfish 分组密码设计的密码哈希函数,通过 EksBlowfish 密钥扩展刻意放慢计算速度。它自带 16 字节随机盐(同样的密码每次结果都不同,可抵御彩虹表),并通过 cost 因子让计算量指数增长,从而大幅提高暴力破解成本。相比 MD5 / SHA-1 等快速哈希,它更适合存储口令。

cost 因子应该选多少?

cost 是 2 的指数:密钥扩展轮数 = 2^cost。通用建议是让单次哈希耗时落在 100~300ms 之间:在多数服务端环境下 cost=10~12 较合适。本工具提供 4~15 的滑块范围;数字越大越安全但越慢。cost≥13 时页面会要求二次确认,避免误选导致长时间等待。

密码超过 72 字节为什么会截断?

bcrypt 的密钥扩展最多只读取前 72 字节(包含末尾补的 0x00),超出部分会被忽略。因此超长的口令并不会更安全,前缀相同的两个长密码会被视为同一个密码。工具会在输入超过 72 字节时明确提示「仅前 72 字节有效」,这也是 $2a$/$2b$/$2y$ 的既有行为。

$2a$、$2b$、$2y$ 有什么区别?

三者算法核心一致,差异在于历史实现中的细节修正:$2a$ 是最早的版本,存在对超长密码与高位字节处理不一致的问题;$2b$ 修正了这些缺陷,是当前推荐与默认的版本;$2y$ 主要出现在 PHP 的实现中以避免旧库误判。本工具生成默认使用 $2b$,并支持解析与校验 $2a$ / $2y$ 的既有哈希。

为什么同一个密码每次生成的哈希都不一样?

因为每次生成都会重新产生一个随机盐,盐会参与密钥扩展并被写进最终的哈希字符串。这是 bcrypt 的预期行为,也让攻击者无法用预计算表批量破解。校验时无需记住盐——盐已包含在哈希中,直接粘贴整个哈希即可。

生成的哈希能被后端或 Python 的 bcrypt 验证吗?

可以。本工具输出的即为标准 60 字符 bcrypt 字符串,与 OpenBSD bcrypt、Python 的 bcrypt、Node 的 bcryptjs 等实现完全兼容,可直接用于 Django、Flask、Spring Security 等框架的密码校验。全部计算都在浏览器本地完成,明文与哈希不会上传到任何服务器。

更多在线工具