BCrypt 密码哈希

生成带随机盐的 bcrypt 密码哈希,在线校验密码匹配并解析版本、cost 与盐

生成哈希

每次生成使用新的随机盐,同一密码每次结果不同属正常现象;盐内嵌在哈希中,无需单独保存。

cost 每加 1 计算耗时约翻倍:10 为业界常用默认,12 以上等待明显,15 约需数十秒。

输入密码后点击「生成哈希」

校验哈希

粘贴既有 bcrypt 哈希并输入明文密码即可比对,支持 $2a$/$2b$/$2y$/$2x$ 前缀。

版本 $2a · cost 6 · 盐 If6bvum7DFjUnE9p2uDeDu

待校验

纯浏览器端本地运算(Web Crypto 生成随机盐 + Web Worker 计算),密码与哈希不会上传到任何服务器。

常见问题

bcrypt 和 SHA-256 存密码有什么区别?
SHA-256 是快速哈希,攻击者可用 GPU 每秒尝试数十亿次,不适合直接存密码。bcrypt 是自适应慢哈希:计算耗时由 cost 因子控制(可随硬件升级调高),且自带随机盐,彩虹表与暴力破解的成本都高得多。存用户密码应选 bcrypt(或 argon2),SHA-256 适合做完整性校验。
cost 因子选多少合适?
经验法则:让单次哈希耗时落在 100-300 毫秒。如今通常取 10-12:cost 每加 1 耗时翻倍,10 约几十毫秒,12 约 300-500 毫秒。注册/登录频率高的系统取低些,安全优先的系统取高些;已上线的哈希可通过逐步升级 cost 再哈希来加固。
$2a$、$2b$、$2y$ 前缀有什么区别?
三者是 bcrypt 的版本标记,算法核心一致、校验互通:$2a$ 是最早期版本(旧系统常见);$2b$ 是 OpenBSD 修正后的当前标准,本工具生成默认使用;$2y$ 是 PHP password_hash 使用的标记,等价于修正版实现。另有罕见的 $2x$(历史兼容标记)。校验时本工具全前缀兼容。
为什么提示密码超过 72 字节会被截断?
bcrypt 规范只处理密码的前 72 字节,超出部分在运算前被静默丢弃——即「abc…后接任意字符」与「abc…」哈希相同。注意是字节不是字符:中文每字占 3 字节、emoji 占 4 字节,24 个汉字就会顶到上限。超长密码想不截断,可先对密码做一次 SHA-256 再送 bcrypt。
为什么每次生成的哈希都不一样?
这是设计使然:每次生成都用新的随机盐,同一密码每次结果都不同。盐内嵌在哈希字符串里(第 8-29 位),校验时 bcrypt 会自动从哈希中取出盐再计算比对,因此无需单独保存盐,直接存整条 60 字符哈希即可。

相关工具