什么是 bcrypt?
Bcrypt 是一种由 Niels Provos 和 David Mazières 设计的密码哈希函数,基于 Blowfish 密码算法。与 MD5 或 SHA-256 等快速摘要不同,bcrypt 故意设计得缓慢且计算密集——这使得对窃取的密码哈希进行暴力攻击变得不切实际。Bcrypt 自动为每个密码生成随机盐,因此相同的密码会产生不同的哈希。
bcrypt 是如何工作的?
Bcrypt 算法完全在您的浏览器中运行。以下是逐步过程:
- 您的密码被编码为 UTF-8 字节,然后输入到 bcrypt 密钥调度中,该调度使用密码和盐初始化 Blowfish 密码算法的 4,184 字节 P 数组和 S 盒。
- 生成一个随机的 128 位盐。盐被混入密钥调度中,因此每个唯一的盐即使对于相同的密码也会产生完全不同的哈希。
- 密钥调度运行 2^cost 轮(例如,成本 10 时为 2^10 = 1,024 次迭代)。每次迭代重新加密盐和 P 数组条目,使得计算随着成本增加而按比例变慢。
- 最终输出是一个 60 字符的字符串,格式为
$2b$<cost>$<salt><hash>,其中 cost 是零填充的(例如 10),salt 是 22 个 Base64 字符,hash 是 31 个 Base64 字符。 - 对于验证,相同的算法再次运行,使用候选密码和从存储哈希中提取的盐。如果派生哈希与存储的哈希匹配,则密码正确。
我应该使用哪个成本因子?
成本因子是迭代次数的对数——成本 10 意味着 2^10 = 1,024 轮,成本 12 意味着 4,096 轮。根据您的安全需求和硬件选择:
- 成本 4-6(16-64 轮)——仅用于开发和测试。对于生产环境来说太快了,提供的保护很少。
- 成本 8(256 轮)——非关键应用的最低要求。在现代硬件上大约 6 毫秒。
- 成本 10(1,024 轮)——当前推荐的基线。大约需要 25 毫秒。适用于大多数 Web 应用。
- 成本 12(4,096 轮)——推荐用于管理门户、金融系统和高安全性应用。大约需要 100 毫秒。
- 成本 14(16,384 轮)——高安全性。大约需要 400 毫秒。用于主密码、加密密钥或登录延迟可接受的情况。
为什么使用这个 bcrypt 生成器?
- 隐私保护——每个密码都在您的浏览器中本地哈希,数据永远不会离开您的设备。
- 双模式——无需切换页面即可并排生成新哈希或验证现有哈希。
- 可调成本因子——从 4(快速)到 15(非常慢)调整工作因子,以满足您的应用安全需求。
- 标准兼容——生成的哈希使用标准的
$2b$格式,兼容所有主流的语言和框架。
bcrypt 的常见应用有哪些?
Bcrypt 广泛应用于行业中的密码存储和验证:
- Web 应用用户认证——将用户密码哈希存储在数据库中,从而永远不保存明文密码。
- API 密钥哈希——在存储前对 API 密钥进行哈希,这样数据库泄露不会暴露有效凭据。
- 迁移审计——验证来自旧系统的遗留密码哈希在升级认证层后仍能验证用户。
bcrypt 哈希长什么样?
使用成本因子 10 对密码 hunter2 进行哈希会产生类似 $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy 的字符串。格式分解为:$2b$(算法版本)、10(成本因子)、$,然后是 22 个字符的盐和 31 个字符的哈希,全部采用 Base64 编码。每次使用相同的密码运行都会因为随机盐而产生不同的哈希。
这个 bcrypt 生成器完全在您的浏览器中使用纯 JavaScript 实现运行。在存储密码前进行哈希,验证现有哈希,调整成本因子以匹配您的安全需求——一切都无需向服务器发送一个字节。