Bcrypt 哈希生成与验证
编码所有处理都在浏览器本地完成,数据不上传服务器
输入
把文件拖到这里可直接载入
输出
生成或验证 bcrypt 密码哈希 —— 也就是今天存密码时该用的那一个(另一个是 scrypt 与 Argon2)。它的核心不是「算得快」,而是故意算得慢:成本因子每加一,计算量翻倍,攻击者的暴力破解成本跟着翻倍,而正常登录只慢几十毫秒。哈希串里已经包含了算法标识、成本因子与盐,所以验证时不需要另存任何东西,把它整串存进数据库的用户表即可。这里用 `$2y$` 前缀(PHP 的 password_hash 用它),验证时也接受 `$2a$` 与 `$2b$` —— 三者在标准输入上完全等价。全部计算在本地完成,密码与哈希都不会上传。
功能
- 两个方向:生成哈希、验证密码与哈希是否匹配
- 成本因子 4–15 可调,界面上标注了每一档的大致耗时
- 输出 `$2y$` 前缀(PHP 兼容),验证时同时接受 `$2a$` 与 `$2b$`
- 哈希里自带盐与参数,验证时不需要另存任何额外信息
- 每次生成的盐不同,同一个密码两次得到不同的哈希
- 长度不对或格式不对时指出具体原因,而不是只说「验证失败」
使用方法
- 选择模式:生成或验证
- 生成模式下设定成本因子;验证模式下把已有哈希填进对应字段
- 把密码粘贴进输入框
- 按 Ctrl/⌘ + Enter 或点「运行」,然后复制结果
常见问题
- 成本因子该设多少?
- 默认 10(约 60 毫秒)对绝大多数场景够用。它的取舍是「服务器每次验证要等多久」与「攻击者每次尝试要算多久」——两者是同一个数字,所以不能一味调大。12 是常见的选择,15 会让每次验证接近两秒(高流量站点会明显感到压力)。要更强的保护请换 scrypt 或 Argon2,它们能在同样的耗时下要求更多内存,而内存恰恰是攻击者最难堆的资源。
- 为什么同一个密码两次生成的哈希不一样?
- 因为每次都会生成一个随机盐并写进哈希串里(`$2y$10$` 之后的那 22 个字符)。这是防「彩虹表」的关键:没有盐的话,攻击者可以预先算好常见密码的哈希做成表,一次查出所有相同的密码;有了随机盐,同一个密码在每条记录里的哈希都不同,那张表就失效了。所以「两次结果不同」是正确的表现,不是 bug。
- 验证失败时怎么判断是密码错了还是哈希格式不对?
- 本工具会区分这两件事:哈希格式不对(比如少了 `$2y$` 前缀、长度不是 60)会明确报「这不是一个 bcrypt 哈希」并指出正确的格式;而格式正确、只是密码对不上时,结果是「不匹配」。另外注意,从数据库里复制哈希时容易带上空格或换行,两端会被自动去掉。
- bcrypt 有什么局限?
- 有两个值得知道。第一,它截断到 72 字节:更长的密码后半段会被忽略,所以「超长密码更安全」在 bcrypt 上不成立(本工具不会因此报错,但请知道这一点)。第二,它只消耗 CPU、不消耗内存,所以显卡并行破解它相对划算 —— 这正是 scrypt 与 Argon2 被设计出来的原因。对于普通网站,bcrypt 仍然完全够用;密码学要求更高的场合请用 Argon2id。
相关工具
Scrypt 生成与验证
编码生成 scrypt 密码哈希(PHC 格式)或验证已有哈希,参数可调,输出可选 PHC / 十六进制 / Base64,内存超预算时会明确提示。
哈希计算
编码算出文本的 MD5、SHA-1、SHA-256 或 SHA-512 摘要,也可算老系统用的 MD4 与 MD2,中文按 UTF-8 字节计算。全部在本地完成。
数据库密码哈希
编码生成 PostgreSQL 的 md5、MySQL 与 MariaDB 的 mysql_native_password 密码哈希,并给出可直接使用的 SQL 语句。
Base64 编解码
编码把文本转成 Base64,或把 Base64 还原成文本,中文与 emoji 都按 UTF-8 正确处理。全部在浏览器本地完成,内容不上传。
URL 编解码
编码把中文、空格与符号转义成 %XX,或把 %XX 还原成文本;整条 URL 与单独的参数值要选对方式,选错不会报错,但链接会打不开。全部在浏览器本地完成。
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。