生成和验证 Bcrypt 密码哈希
Bcrypt 是一种专门为密码存储设计的哈希算法,由 Niels Provos 和 David Mazières 于 1999 年在 USENIX 会议上提出。它基于 Blowfish 加密算法,通过引入 盐值(Salt) 和 可配置的计算轮数(Cost Factor),使得暴力破解和彩虹表攻击变得极其困难。
与 MD5、SHA-256 等通用哈希算法不同,Bcrypt 的核心设计理念是 刻意慢速。对于用户登录验证来说,几百毫秒的延迟几乎无感,但对于攻击者进行大规模暴力破解而言,这种"慢"是致命的——每秒只能尝试少量密码组合。
$2a$10$... 中的数字(如 10)控制计算强度。数字每增加 1,计算量翻倍。这使 Bcrypt 能够随着硬件性能提升而"升级"安全强度。$2a$rounds$22-char-salt31-char-hash。一个典型的 Bcrypt 哈希长这样:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
成本因子决定了 Bcrypt 的计算复杂度。选择合适的值需要在 安全性 和 用户体验 之间找到平衡:
| 成本因子 | 计算轮数 | 典型耗时 | 适用场景 |
|---|---|---|---|
| 4 | 16 | ~1 ms | 仅测试用,不推荐生产环境 |
| 6 | 64 | ~4 ms | 低安全需求 |
| 8 | 256 | ~16 ms | 一般应用 |
| 10 | 1024 | ~65 ms | 推荐默认值 |
| 12 | 4096 | ~260 ms | 高安全需求 |
| 14 | 16384 | ~1 秒 | 极高安全需求 |
建议:对于大多数 Web 应用,成本因子 10 是一个很好的起点。随着服务器性能提升,可以逐步增加。一个实用的经验法则是:调整成本因子使得单次哈希耗时在 250-500ms 之间,这样既能保证安全,又不会明显影响用户体验。
| 算法 | 特点 | 推荐度 |
|---|---|---|
| Bcrypt | 久经考验(1999年),内存密集型,抗 GPU 加速,生态成熟 | ⭐⭐⭐⭐⭐ |
| Argon2 | 2015 年密码哈希竞赛冠军,可调内存/时间/并行度 | ⭐⭐⭐⭐⭐ |
| PBKDF2 | NIST 推荐,基于 HMAC,可调迭代次数 | ⭐⭐⭐⭐ |
| Scrypt | 内存密集型,但参数调优复杂 | ⭐⭐⭐⭐ |
| SHA-256(直接使用) | 速度太快,极易被暴力破解,不应用于密码存储 | ❌ |
| MD5(直接使用) | 已完全破解,绝对不可用于密码 | ❌❌ |
bcrypt 或 bcryptjs、Python 的 bcrypt、Go 的 golang.org/x/crypto/bcrypt。compare 函数,而非自己用 === 比较,以防止时序攻击(Timing Attack)。在日常开发中,开发者经常需要快速生成 Bcrypt 哈希用于测试数据、验证密码迁移方案、或调试认证流程。我们的在线 Bcrypt 工具提供了一键哈希生成和密码验证功能,支持 4-14 的可调成本因子,完全在浏览器中运行(使用 bcryptjs 库),数据不会上传到服务器,安全可靠。无需安装任何软件,打开浏览器即可使用,是每个后端开发者的必备工具箱。