🔒 Bcrypt

生成和验证 Bcrypt 密码哈希

🔐 生成哈希
计算轮数 (Cost Factor)
✅ 验证密码

什么是 Bcrypt?

Bcrypt 是一种专门为密码存储设计的哈希算法,由 Niels Provos 和 David Mazières 于 1999 年在 USENIX 会议上提出。它基于 Blowfish 加密算法,通过引入 盐值(Salt)可配置的计算轮数(Cost Factor),使得暴力破解和彩虹表攻击变得极其困难。

与 MD5、SHA-256 等通用哈希算法不同,Bcrypt 的核心设计理念是 刻意慢速。对于用户登录验证来说,几百毫秒的延迟几乎无感,但对于攻击者进行大规模暴力破解而言,这种"慢"是致命的——每秒只能尝试少量密码组合。

Bcrypt 的核心特性

  • 内置盐值(Salt):每次生成哈希时自动包含随机盐值,无需开发者手动管理。即使两个用户使用完全相同的密码,生成的哈希值也完全不同。
  • 可配置的成本因子(Cost Factor):通过 $2a$10$... 中的数字(如 10)控制计算强度。数字每增加 1,计算量翻倍。这使 Bcrypt 能够随着硬件性能提升而"升级"安全强度。
  • 抗 GPU/ASIC 加速:Bcrypt 算法需要大量内存访问,这使得 GPU 和专用硬件的并行加速效果大打折扣。
  • 输出格式固定:始终产生 60 字符的哈希字符串,格式为 $2a$rounds$22-char-salt31-char-hash
  • 单向不可逆:只能从明文生成哈希,无法从哈希反推明文。验证时需将待验证文本重新哈希后比对。

Bcrypt 哈希格式详解

一个典型的 Bcrypt 哈希长这样:

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

  • $2a$:算法版本标识(还有 $2b$、$2y$ 等变体,修复了一些边界情况)。
  • 10:成本因子(Cost Factor),表示进行 2^10 = 1024 轮计算。
  • N9qo8uLOickgx2ZMRZoMye:22 字符的盐值(128 位,Base64 编码)。
  • IjZAgcfl7p92ldGxad68LJZdL17lhWy:31 字符的哈希结果(184 位,Base64 编码)。

成本因子(Cost Factor)如何选择?

成本因子决定了 Bcrypt 的计算复杂度。选择合适的值需要在 安全性用户体验 之间找到平衡:

成本因子计算轮数典型耗时适用场景
416~1 ms仅测试用,不推荐生产环境
664~4 ms低安全需求
8256~16 ms一般应用
101024~65 ms推荐默认值
124096~260 ms高安全需求
1416384~1 秒极高安全需求

建议:对于大多数 Web 应用,成本因子 10 是一个很好的起点。随着服务器性能提升,可以逐步增加。一个实用的经验法则是:调整成本因子使得单次哈希耗时在 250-500ms 之间,这样既能保证安全,又不会明显影响用户体验。

Bcrypt vs 其他密码哈希算法

算法特点推荐度
Bcrypt久经考验(1999年),内存密集型,抗 GPU 加速,生态成熟⭐⭐⭐⭐⭐
Argon22015 年密码哈希竞赛冠军,可调内存/时间/并行度⭐⭐⭐⭐⭐
PBKDF2NIST 推荐,基于 HMAC,可调迭代次数⭐⭐⭐⭐
Scrypt内存密集型,但参数调优复杂⭐⭐⭐⭐
SHA-256(直接使用)速度太快,极易被暴力破解,不应用于密码存储
MD5(直接使用)已完全破解,绝对不可用于密码❌❌

Bcrypt 的常见使用场景

  • Web 应用用户认证:Node.js (Express)、Python (Django/Flask)、Ruby on Rails、PHP (Laravel) 等框架广泛使用 Bcrypt 作为默认密码哈希方案。
  • API 密钥存储:将 API 密钥的哈希值存入数据库,验证时重新计算比对。
  • 数据库密码字段:数据库中仅存储 Bcrypt 哈希,即使数据库泄露,攻击者也无法直接获取明文密码。
  • 配置文件密码保护:避免在配置文件中明文书写密码。

Bcrypt 最佳实践

  • 永远不要自己实现哈希算法:使用经过安全审计的成熟库,如 Node.js 的 bcryptbcryptjs、Python 的 bcrypt、Go 的 golang.org/x/crypto/bcrypt
  • 选择合适的成本因子:在部署前测试不同成本因子在你服务器上的实际耗时,选择满足安全需求的最大值。
  • 使用恒定时间比较:验证密码时必须使用库提供的 compare 函数,而非自己用 === 比较,以防止时序攻击(Timing Attack)。
  • 对每次哈希使用新的随机盐值:Bcrypt 已自动处理,无需额外操作。
  • 限制密码长度:Bcrypt 最多处理 72 字节的输入(含 null 终止符则为 71 字符)。对于超长密码,建议先使用 SHA-256 做一次预哈希。
  • 定期升级成本因子:随着硬件发展,逐步提高成本因子以维持安全强度。

为什么需要在线 Bcrypt 工具?

在日常开发中,开发者经常需要快速生成 Bcrypt 哈希用于测试数据、验证密码迁移方案、或调试认证流程。我们的在线 Bcrypt 工具提供了一键哈希生成和密码验证功能,支持 4-14 的可调成本因子,完全在浏览器中运行(使用 bcryptjs 库),数据不会上传到服务器,安全可靠。无需安装任何软件,打开浏览器即可使用,是每个后端开发者的必备工具箱。