§

Bcrypt 生成器

§

生成 Bcrypt 哈希

10 (1,024 rounds)

Bcrypt 自 1999 年由 Provos 和 Mazières 推出以来,一直是美国网络开发中首选的密码哈希方案。NIST SP 800-63B 建议使用内存硬哈希进行密码存储,OWASP 将 bcrypt 列为与 Argon2id 并列的优选方案。Rails 通过 has_secure_password 内置了 bcrypt,Django 支持将其作为可插拔后端,Node.js 开发者使用 bcryptjs 库。成本因子控制单个哈希所需的时间——成本翻倍,工作量翻倍。大多数应用以成本 10(1,024 轮)为基线,而金融或管理系统通常使用 12(4,096 轮)。此工具完全在浏览器中使用 JavaScript 运行,因此您的密码永远不会离开您的设备。

什么是 bcrypt?

Bcrypt 是一种由 Niels Provos 和 David Mazières 设计的密码哈希函数,基于 Blowfish 密码算法。与 MD5 或 SHA-256 等快速摘要不同,bcrypt 故意设计得缓慢且计算密集——这使得对窃取的密码哈希进行暴力攻击变得不切实际。Bcrypt 自动为每个密码生成随机盐,因此相同的密码会产生不同的哈希。

bcrypt 是如何工作的?

Bcrypt 算法完全在您的浏览器中运行。以下是逐步过程:

  1. 您的密码被编码为 UTF-8 字节,然后输入到 bcrypt 密钥调度中,该调度使用密码和盐初始化 Blowfish 密码算法的 4,184 字节 P 数组和 S 盒。
  2. 生成一个随机的 128 位盐。盐被混入密钥调度中,因此每个唯一的盐即使对于相同的密码也会产生完全不同的哈希。
  3. 密钥调度运行 2^cost 轮(例如,成本 10 时为 2^10 = 1,024 次迭代)。每次迭代重新加密盐和 P 数组条目,使得计算随着成本增加而按比例变慢。
  4. 最终输出是一个 60 字符的字符串,格式为 $2b$<cost>$<salt><hash>,其中 cost 是零填充的(例如 10),salt 是 22 个 Base64 字符,hash 是 31 个 Base64 字符。
  5. 对于验证,相同的算法再次运行,使用候选密码和从存储哈希中提取的盐。如果派生哈希与存储的哈希匹配,则密码正确。

我应该使用哪个成本因子?

成本因子是迭代次数的对数——成本 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 实现运行。在存储密码前进行哈希,验证现有哈希,调整成本因子以匹配您的安全需求——一切都无需向服务器发送一个字节。