实用工具
输入
结果
结果会显示在这里。Laravel、Spring Security、Rails 的 has_secure_password 默认都用 bcrypt 存密码,所以迟早会遇到两件事:给种子用户手工生成一个哈希,或者排查某个账号为什么总是登录失败。这个工具两件都能做——按选定的成本因子给密码生成哈希,或者粘贴数据库里存的哈希,看某个密码能不能对上。底层是 bcrypt.js(dcodeIO/bcrypt.js,3.8k star,BSD-3-Clause),一个零依赖的纯 JavaScript 实现,生成的哈希与 PHP password_hash、Python bcrypt、Go x/crypto/bcrypt 完全通用。注意 bcrypt 是哈希不是加密,没有「解密」这回事,只能校验。
它是怎么工作的
- 每次生成都用 crypto.getRandomValues 取一个新的 128 位盐,所以同一个密码算两次会得到两个不同的 60 字符哈希,而两者都能校验通过。
- 成本因子是轮数的以 2 为底的对数:cost 10 即 1,024 轮,每加 1 耗时翻倍;结果里显示的耗时是在你这台设备上实测的。
- 校验时用存储哈希里自带的盐和成本重新计算,再做常数时间比较,和服务端登录校验的逻辑完全一致。
- bcrypt 只读取密码的前 72 个字节,超出部分会被标出;粘贴时带进来的末尾换行会被去掉,空格则保留。
你的数据去了哪里
哪也没去。本工具完全在你的浏览器里运行:你粘贴的文本由页面处理,不会传输到任何服务器,也不会写进任何日志。
本工具会接触密钥和凭证,因此任何一次运行都不会被保存,连你自己的历史里也不会有。
它要花多少
本工具完全免费,不需要登录,也不消耗积分。
常见问题
- 成本因子设多少合适?
- OWASP 密码存储备忘单要求至少 10。实际做法是选你的登录服务器能承受的最高值——在那台机器上实测每次哈希大约 100–250 毫秒,而不是以这里的耗时为准。cost 12 是 cost 10 的 4 倍耗时,15 是 32 倍;达到 13 及以上时工具会提醒你,因为每一次登录和攻击者的每一次猜测都要付出这个代价。
- $2a$、$2b$、$2y$ 有什么区别?
- 算法完全相同,只是修复历史 bug 后打的不同标签。$2y$ 是 PHP 的 crypt_blowfish 在 2011 年修复非 ASCII 字节符号扩展漏洞后引入的;$2b$ 是 OpenBSD 在 2014 年修复密码长度在 256 字节处回绕的问题后引入的。只要密码短于 72 字节,三者除前缀外结果一模一样,主流库也都能校验这三种前缀。
- 为什么很长的密码改了结尾还能校验通过?
- 因为所有 bcrypt 实现都看不到第 72 字节之后的内容。72 字节相当于 72 个英文字符,但在 UTF-8 下只有 24 个汉字,中文口令很容易超限。如果必须支持更长的口令,有的系统会先做 SHA-256 再 Base64 编码后交给 bcrypt——千万别直接传原始二进制摘要,其中的零字节在很多实现里会截断密码。
- 2026 年了,bcrypt 还能用吗?
- 还能用,而且远好于 MD5、SHA-256 这类快速哈希。但 OWASP 现在把 Argon2id 排第一、scrypt 第二,因为 bcrypt 内存占用小,用 GPU 和专用硬件破解的成本相对更低。已经在用 bcrypt 的系统,常见做法是逐步调高成本因子,并在用户下次登录时重新哈希。
- 密码和哈希会被上传吗?
- 不会。生成和校验都在当前页面的 JavaScript 里完成,没有任何网络请求,站点也不记录这次运行——即使你已登录,历史记录里也不会有。
背后的开源项目
本工具运行在 dcodeIO/bcrypt.js 之上,以 BSD-3-Clause 许可发布。如果你需要在自己的程序里实现同样的能力,直接用这个库。
dcodeIO/bcrypt.js也常被称作
- bcrypt在线加密
- bcrypt解密
- bcrypt校验
- bcrypt密码生成
- password_hash 在线
- bcrypt cost