什么是 Bcrypt
Bcrypt 是基于 Blowfish 加密算法的密码哈希函数,由 Niels Provos 和 David Mazières 于 1999 年设计。它被公认为密码哈希的黄金标准,广泛应用于用户密码存储场景。
与普通哈希(如 SHA-256)不同,Bcrypt 专门为密码存储设计,内置了盐值生成和可调节的工作因子。
为什么需要 Bcrypt
- 抵抗暴力破解:可调节的计算成本让暴力破解变得不切实际
- 内置盐值:每次哈希自动生成随机盐值,防止彩虹表攻击
- 工作因子可调:随着硬件性能提升,可以增加计算成本
- 时间-成本权衡:合法用户登录只需几百毫秒,但攻击者尝试十亿次密码需要数百年
Bcrypt 哈希格式
Bcrypt 哈希的格式为:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
│ │ │ └─────────────────────────────────── 22位盐值
│ │ └────────────────────────────────────── 31位哈希值
│ └───────────────────────────────────────── 工作因子(cost=10)
└──────────────────────────────────────────── 算法版本(2a)
| 部分 | 说明 |
|------|------|
| $2a$ | 算法版本(2a / 2b / 2y) |
| $10$ | 工作因子(2^10 = 1024 次迭代) |
| N9qo8uLOickgx2ZMRZoMye | 22 字符盐值 |
| IjZAgcfl7p92ldGxad68LJZdL17lhWy | 31 字符哈希值 |
工作因子(Cost Factor)
工作因子决定了 Bcrypt 的计算成本,是 2 的幂次:
| 工作因子 | 迭代次数 | 近似耗时(2024年硬件) | |---------|---------|---------------------| | 8 | 256 次 | ~30ms | | 10 | 1,024 次 | ~100ms | | 12 | 4,096 次 | ~300ms | | 14 | 16,384 次 | ~1.2s |
建议:选择让用户登录耗时约 100-300ms 的工作因子。当前推荐 10-12。
如何使用在线 Bcrypt 哈希工具
使用 DevToolkit Pro 的 Bcrypt 哈希工具:
生成哈希
- 输入明文密码
- 选择工作因子(默认 10)
- 点击 Hash 按钮
- 复制生成的 Bcrypt 哈希值
验证密码
- 输入 Bcrypt 哈希值
- 输入待验证的密码
- 点击 Verify 按钮
- 工具显示密码是否匹配
代码示例
Node.js
const bcrypt = require('bcrypt');
// 生成哈希
const hash = await bcrypt.hash('myPassword123', 10);
// '$2a$10$N9qo8uLOickgx2ZMRZoMye...'
// 验证密码
const isMatch = await bcrypt.compare('myPassword123', hash);
// true
Python
import bcrypt
# 生成哈希
password = b'myPassword123'
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=10))
# 验证密码
is_match = bcrypt.checkpw(password, hashed)
# True
Go
import "golang.org/x/crypto/bcrypt"
// 生成哈希
hash, err := bcrypt.GenerateFromPassword([]byte("myPassword123"), 10)
// 验证密码
err = bcrypt.CompareHashAndPassword(hash, []byte("myPassword123"))
// nil if match
Bcrypt vs 其他哈希算法
| 算法 | 速度 | 盐值 | 工作因子 | 推荐用途 | |------|------|------|---------|---------| | MD5 | 极快 | ❌ 需手动 | ❌ | ❌ 不推荐 | | SHA-256 | 快 | ❌ 需手动 | ❌ | ❌ 不推荐 | | Argon2 | 可调 | ✅ 内置 | ✅ | ✅ 新项目首选 | | Bcrypt | 可调 | ✅ 内置 | ✅ | ✅ 成熟可靠 |
安全最佳实践
- 永远不要存储明文密码:使用 Bcrypt 或 Argon2 哈希
- 不要限制密码长度:Bcrypt 截断 72 字节,但应允许用户输入更长密码
- 定期提高工作因子:随着硬件升级,增加成本因子
- 密码修改时重新哈希:用户修改密码后生成新的哈希值
- 使用常量时间比较:验证时使用
timingSafeEqual防止时序攻击
FAQ
Bcrypt 和 Argon2 哪个更好?
Argon2 是 2015 年密码哈希竞赛的获胜者,理论上更安全(抗 GPU/ASIC 攻击)。但 Bcrypt 经过 25 年实战检验,更成熟可靠。新项目推荐 Argon2,现有项目无需迁移。
为什么 Bcrypt 哈希每次结果不同?
Bcrypt 每次自动生成随机盐值,即使输入相同密码,输出的哈希值也不同。验证时通过盐值重新计算来比对。
工作因子设多少合适?
选择让用户登录耗时 100-300ms 的值。2024 年推荐 10-12。随着硬件升级,未来可能需要提高。
本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页。