piapia123
zh

Bcrypt 哈希生成与验证

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

生成或验证 bcrypt 密码哈希 —— 也就是今天存密码时该用的那一个(另一个是 scrypt 与 Argon2)。它的核心不是「算得快」,而是故意算得慢:成本因子每加一,计算量翻倍,攻击者的暴力破解成本跟着翻倍,而正常登录只慢几十毫秒。哈希串里已经包含了算法标识、成本因子与盐,所以验证时不需要另存任何东西,把它整串存进数据库的用户表即可。这里用 `$2y$` 前缀(PHP 的 password_hash 用它),验证时也接受 `$2a$` 与 `$2b$` —— 三者在标准输入上完全等价。全部计算在本地完成,密码与哈希都不会上传。

功能

  • 两个方向:生成哈希、验证密码与哈希是否匹配
  • 成本因子 4–15 可调,界面上标注了每一档的大致耗时
  • 输出 `$2y$` 前缀(PHP 兼容),验证时同时接受 `$2a$` 与 `$2b$`
  • 哈希里自带盐与参数,验证时不需要另存任何额外信息
  • 每次生成的盐不同,同一个密码两次得到不同的哈希
  • 长度不对或格式不对时指出具体原因,而不是只说「验证失败」

使用方法

  1. 选择模式:生成或验证
  2. 生成模式下设定成本因子;验证模式下把已有哈希填进对应字段
  3. 把密码粘贴进输入框
  4. 按 Ctrl/⌘ + Enter 或点「运行」,然后复制结果

常见问题

成本因子该设多少?
默认 10(约 60 毫秒)对绝大多数场景够用。它的取舍是「服务器每次验证要等多久」与「攻击者每次尝试要算多久」——两者是同一个数字,所以不能一味调大。12 是常见的选择,15 会让每次验证接近两秒(高流量站点会明显感到压力)。要更强的保护请换 scrypt 或 Argon2,它们能在同样的耗时下要求更多内存,而内存恰恰是攻击者最难堆的资源。
为什么同一个密码两次生成的哈希不一样?
因为每次都会生成一个随机盐并写进哈希串里(`$2y$10$` 之后的那 22 个字符)。这是防「彩虹表」的关键:没有盐的话,攻击者可以预先算好常见密码的哈希做成表,一次查出所有相同的密码;有了随机盐,同一个密码在每条记录里的哈希都不同,那张表就失效了。所以「两次结果不同」是正确的表现,不是 bug。
验证失败时怎么判断是密码错了还是哈希格式不对?
本工具会区分这两件事:哈希格式不对(比如少了 `$2y$` 前缀、长度不是 60)会明确报「这不是一个 bcrypt 哈希」并指出正确的格式;而格式正确、只是密码对不上时,结果是「不匹配」。另外注意,从数据库里复制哈希时容易带上空格或换行,两端会被自动去掉。
bcrypt 有什么局限?
有两个值得知道。第一,它截断到 72 字节:更长的密码后半段会被忽略,所以「超长密码更安全」在 bcrypt 上不成立(本工具不会因此报错,但请知道这一点)。第二,它只消耗 CPU、不消耗内存,所以显卡并行破解它相对划算 —— 这正是 scrypt 与 Argon2 被设计出来的原因。对于普通网站,bcrypt 仍然完全够用;密码学要求更高的场合请用 Argon2id。

相关工具