bcrypt 是专门用来存密码的慢哈希。它自带随机盐(同一个密码每次生成的哈希都不同),并且有一个成本因子 cost:每加 1,计算量翻一倍,随硬件变快可以调高来对抗爆破。哈希串本身就包含了版本、cost 和盐,形如:
$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
└┬┘ └┬┘ └──────────────────┬─────────────────────────────┘
版本 cost 22 字符盐 + 31 字符哈希
$2a$ / $2b$ / $2y$:$2b$ 是修正了早期长度 bug 的当前版本,$2y$ 是 PHP 的等价物,$2a$ 是旧版。互相基本兼容,校验时按串里写的版本处理。Q:bcrypt 能解密吗? A:不能,它是单向哈希。只能"拿一个候选密码去和哈希比对"。
Q:为什么同一个密码每次生成的哈希不一样? A:因为每次用不同的随机盐。校验时不需要单独存盐——盐就在哈希串里。
Q:和后端(PHP password_hash、Node bcrypt、Spring Security)结果通用吗?
A:通用。bcrypt 是标准算法,只要密码字节一致(注意 72 字节截断和编码),任一实现生成的哈希都能被另一实现校验。
Q:cost 填多少合适? A:新项目从 10 起步,压测服务端后按"单次登录耗时可接受"往上调。
Q:数据会上传吗? A:不会,生成和校验都在浏览器本地用 bcryptjs 完成。
相关:scrypt · 随机密码生成 · SHA · Htpasswd 生成 · 文字加解密。