Bcrypt 生成器
使用随机的 16 字节盐值和 4 到 12 的成本因子创建 bcrypt 密码哈希。此工具会返回以 $2a$ 开头的标准模块化加密字符串,PHP password_verify、Node.js bcrypt、Spring Security 和大多数框架都能接受。可用它为测试用户生成初始数据、在数据库中重置管理员密码,或检查自己的哈希代码。密码绝不会被回显或存储。
常见问题
什么是 bcrypt?
Bcrypt 是一种源自 1999、基于 Blowfish 密码算法的密码哈希函数。它将随机盐值与可调成本结合,因此成本每增加一级,攻击者针对每次猜测所需的工作量就会翻倍。它仍是广受支持的密码存储方案。
输出字符串代表什么?
像 $2a$10$ 后跟 53 个字符这样的哈希,包含版本 2a、成本 10、22 个字符的盐值和 31 个字符的哈希,全部使用 bcrypt 自己的 Base64 字符集。请存储整个字符串,因为验证器会从中读取盐值和成本。
应该选择哪个成本因子?
此工具允许设置 4 到 12 的成本,默认值为 10,这是常见的框架默认值。每提高一级,耗时就会翻倍,因此成本为 12 时,耗时约为成本为 10 时的四倍。在生产环境中,应选择服务器能承受的最高成本,使耗时大致控制在 100 到 250 毫秒之间。
为什么成本上限是 12?
更高的成本会使每次哈希耗时数秒,导致单个请求长时间占用服务器。对于大多数应用,成本 12 已经足够强;如有需要,你可以在自己的环境中使用更高成本重新计算哈希。
为什么同一个密码每次生成的哈希都不同?
此工具会为每次哈希生成新的随机 16 字节盐值。不同盐值会生成不同字符串,但都能通过同一个密码验证。这样可以防止攻击者使用预计算表。
密码长度有限制吗?
有限制。Bcrypt 只使用密码的前 72 字节,因此此工具会拒绝更长的密码,而不会悄悄忽略多余部分。非 ASCII 字符在 UTF-8 中各占多个字节。
PHP 或 Laravel 能接受 $2a$ 哈希吗?
能。PHP password_verify、Laravel、Symfony 以及使用 password_hash 的 WordPress 插件都能接受 $2a$、$2b$ 和 $2y$ 哈希;这些版本之间只有历史上的错误修复差异。Node.js bcrypt、bcryptjs、Python bcrypt 和 Spring Security 也接受 $2a$。
我的密码会被存储或记录吗?
不会。密码仅用于在请求期间计算哈希。它会从响应中移除,也绝不会写入日志或存储。
我应该使用 bcrypt 还是 Argon2?
OWASP 目前更推荐 Argon2id,因为它需要大量内存,会增加 GPU 攻击的成本。bcrypt 仍然是可接受的选择,而且有非常广泛的库支持,因此在无法使用 Argon2 时,它是可靠的选择。
如何检查密码是否与 bcrypt 哈希匹配?
使用本网站的 Bcrypt Verifier,或调用你所用框架的 verify 函数。切勿直接比较 bcrypt 字符串,因为同一密码的新哈希看起来总是不同。