🧂bcrypt 在线加密与验证 - Argon2、scrypt、PBKDF2 密码哈希
开发登录功能、迁移用户表或排查“密码明明对却登不上”时,常常需要现场生成或验证一个密码哈希。这里可以生成四种主流算法的哈希:bcrypt(cost 4~14,可选 $2b$、$2y$、$2a$ 前缀)、Argon2(Argon2id / 2i / 2d,可调内存、迭代次数、并行度)、scrypt(N、r、p)和 PBKDF2(HMAC-SHA1/256/512),输出格式与 PHP password_hash、Django、Flask/Werkzeug、passlib 等常用框架兼容,并显示实际耗时,方便评估服务器上的成本参数。验证时只需粘贴哈希字符串和密码,工具会自动识别格式与参数,用同样的盐重新计算并比较。bcrypt、scrypt、Argon2 都是用纯 TypeScript 自行实现的,与 OpenBSD、PHP、Node.js、Python 的结果逐一对照测试过;PBKDF2 使用浏览器原生 WebCrypto。计算放在后台线程(Web Worker)里,参数调高也不会卡住页面,随时可以取消。密码和哈希都不会上传或保存。
免费 · 无需注册 · 浏览器本地处理最后更新:
正在加载工具...
如何使用密码哈希生成与验证
- 1选择算法,输入密码,按需调整 cost、内存等参数和输出格式
- 2点击“生成”,复制哈希结果并查看耗时
- 3切到“验证密码”,粘贴哈希和密码,自动识别格式并校验
常见问题
- bcrypt 的 cost 应该设多少?
- cost 每加 1,计算时间翻倍。OWASP 建议至少 10,常见取值是 10~12;更实用的标准是在你的服务器上单次哈希耗时约 100~300 毫秒,可以在这里先试出大概耗时(浏览器与服务器速度会有差异)。注意 bcrypt 只使用密码的前 72 个字节,超出部分不影响结果,工具会给出提示。
- $2a$、$2b$、$2y$ 有什么区别?
- 三者算法相同,只是修复历史 bug 的标记:$2a$ 是早期版本,$2y$ 是 PHP 在修复其实现缺陷后使用的前缀,$2b$ 是 OpenBSD 修复超长密码长度溢出后使用的前缀。对 72 字节以内的密码,三者计算结果相同,一般可以互相验证;新系统推荐 $2b$(PHP 默认输出 $2y$)。
- bcrypt、Argon2、scrypt、PBKDF2 该选哪个?
- 新项目首选 Argon2id(OWASP 推荐 m=19 MiB、t=2、p=1 起步),它同时消耗内存和时间,最能抵抗 GPU 暴力破解;bcrypt 生态最成熟、几乎所有语言都支持;scrypt 同样是内存困难型;PBKDF2 主要用于需要 FIPS 合规的场景,迭代次数要足够高(SHA-256 至少 60 万次)。千万不要用 MD5、SHA-256 这类快速哈希直接存密码。
- 为什么同一个密码每次生成的哈希都不一样?
- 因为每次都会随机生成新的盐(salt),盐和参数一起写在哈希字符串里。验证时从字符串中取出盐和参数重新计算,结果一致就说明密码正确,所以不同的哈希字符串可以对应同一个密码。这正是加盐的意义:相同密码在数据库里也不会出现相同的哈希,彩虹表因此失效。