bcrypt 哈希与校验
加密用 bcrypt(自适应 cost)对口令做哈希,或校验明文是否匹配已有的 $2a$ / $2b$ 哈希;cost 可调,耗时校准,全程在浏览器本地完成。
不获取远程 URL;请直接粘贴你的 JSON。
⚠ cost 越高越慢越安全
本页内容
什么是 bcrypt?#
bcrypt 是一种专门为「刻意变慢」而生的口令哈希函数。像 SHA-256 这类快速哈希追求每秒吞吐数兆字节,而 bcrypt 反其道行之——每一次单独猜测都要付出实实在在的时间。如此一来,偷走一库口令哈希的攻击者就没法廉价地试上几十亿种猜测。「我该怎么存用户口令」的标准答案正是:用 bcrypt 哈希,而不是用普通 SHA-256。
bcrypt 适合这件事,靠两点。其一,它有一个可调的成本因子,让工作量呈指数放大——成本加 1,单次哈希时间大约翻倍,所以「硬件变快」可以用「拧一下旋钮」来回应。其二,每次哈希都掺入随机盐,让相同口令哈希出截然不同的值,于是为某个库预算好的表对另一个库毫无用处。盐和成本都打包在输出字符串里,因此验签只需要口令和哈希本身,无需额外的参数。
本页支持两种操作:把口令哈希成一段 bcrypt 字符串,以及用口令去验证一段已有的哈希。为保证页面流畅,cost 达到 12 及以上时会转入 Web Worker 执行,让重活儿不卡住界面。
怎么使用#
- 选择模式:Hash(把口令产出一段 bcrypt 字符串)或 Verify(用口令去核对一段已有哈希)。
- 输入口令。点击眼睛图标可在输入时明文显示,默认是遮蔽的。支持 UTF-8,包括 emoji 与非拉丁文字。
- 在 hash 模式下,拖动 cost 滑块(4–14,默认 12)。越高越慢也越强。当 cost 高到会明显耗时时,会弹出提示。
- 在 verify 模式下,把已有哈希粘进出现的输入框。cost 会从哈希里自动读出,无需你手动设置。
- 点主按钮。hash 模式下输出那段 bcrypt 字符串;verify 模式下输出清晰的 match / no-match 结论,并附上耗时读数,帮你判断 cost 在自己机器上的实际开销。
核心特性#
- 可调 cost,4–14。 默认 12 是现代推荐值;每加 1 工作量约翻倍,让你能随硬件提速逐年上调。
- 高 cost 自动转 Worker。 cost 达 12 及以上转入 Web Worker,页面不卡;若 Worker 被拦截,会透明地退回主线程,结果不变。
- 内建盐。 每次哈希都用全新随机盐并编进输出,因此同一个口令永远不会哈希出同一段字符串。
- 验签自动识别 cost。 你粘贴的哈希里自带的 cost 会被解析出来,保证「怎么哈希」与「怎么校验」一致。
- 零上传。 哈希与验签全程本地,口令绝不离开本页。
实战示例#
下面是一段真实的、用本页生成的 hunter2 在 cost 12 下的哈希。因为盐是全新随机的,你再哈希一次 hunter2 会得到不同的字符串——但下面这段是真实可验的:把它粘进 verify 模式,输入 hunter2,结论就是 match。
$2b$12$DG/IWIDBmJlywamLdGno2.guEH5lGnQ1OTULdIGN8BH1vqiLIGzjy
逐段读它:
$2b$—— bcrypt 变体(bcryptjs 产出$2b$;验签也接受$2a$、$2x$、$2y$)。12—— 成本因子,意为2^12轮密钥扩展。- 接下来 22 个字符 —— 随机盐。
- 最后 31 个字符 —— 派生出的哈希。
切到 Verify,把上面这段哈希粘进已有哈希框,输入 hunter2,结论是 match。若输入 Hunter2,则是 no match——bcrypt 区分大小写,错一个字符就会翻转结果。旁边显示的耗时,就是 cost 12 在你机器上做一次验签的真实开销。
常见问题#
cost 该选多少?#
今天的新系统选 12 是稳妥的——在典型硬件上大约耗时数百毫秒,对真实登录毫无痛感,对批量猜测却很折磨。对于高价值目标、且能接受登录略慢的场景,可调到 13 或 14。关键原则是:随硬件逐年提速要逐步上调,因为 bcrypt 的成本是指数级增长的——每加 1,时间约翻倍。
为什么同一个口令哈希两次结果不一样?#
因为 bcrypt 每次都生成全新随机盐并嵌进输出。两段哈希看上去毫无关联,却都能验过同一个口令。这正是「加盐」的意义——它让攻击者既认不出重复口令,也无法复用预计算的表。
能验证在别处生成的哈希吗?#
能,只要它是格式良好的 bcrypt 字符串($2a$、$2b$、$2x$、$2y$ 皆可)。在 verify 模式下粘进已有哈希框即可,工具会从哈希里自动读出 cost 与盐。无论是 Node 的 bcrypt、PHP 的 password_hash,还是 Python 的 passlib 导出的哈希,都能在这里验。
存口令,bcrypt 比 SHA-256 好吗?#
存登录口令的话,明显更好。SHA-256 很快——而这对存储口令哈希恰恰是错的属性:拿到哈希的攻击者能在 GPU 上每秒试几十亿次。bcrypt 刻意慢且带盐,正中口令存储所需。完整性校验与签名用 SHA-256;人类口令用 bcrypt(或它的同族 Argon2/scrypt)。