bcrypt:算法与成本因子
了解 bcrypt 的内部机制、工作因子以及如何正确调整成本
bcrypt:算法与成本因子 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
欢迎
bcrypt 是一种专门设计为运行缓慢且抵抗硬件攻击的密码哈希算法,于 1999 年设计完成。它仍然是部署最广泛的密码哈希算法。
bcrypt 的起源
该算法由 Niels Provos 和 David Mazières 设计,基于 Blowfish 密码。名称中的“b”代表 Blowfish。它的关键思路是利用 Blowfish 昂贵的密钥设置过程来有意降低速度。
bcrypt 哈希格式
$2b$12$saltsaltsaltsaltsaltsalthashhashhashhashhashhashhash
$2b$:算法版本
12:成本因子(迭代次数的 log2)
salt:22 个 Base64 字符(16 字节)
hash:31 个 Base64 字符(24 字节)
成本因子
成本 12 = 2^12 = 4096 次迭代。成本 13 = 8192 次迭代。每增加 1,计算时间就会加倍。请调整参数,使哈希过程在您的硬件上耗时约 100–300 毫秒。攻击者的速度也会按相同比例变化。
Python 中的 bcrypt
import bcrypt
password = b'my_password'
salt = bcrypt.gensalt(rounds=12) # 生成随机盐值
hashed = bcrypt.hashpw(password, salt)
# 验证:
bcrypt.checkpw(password, hashed) # True
内置盐值
bcrypt 始终会自动生成并存储盐值。gensalt() 会生成经过密码学保护的 16 字节随机盐值。您不需要单独管理盐值——它已经嵌入哈希字符串中。
bcrypt 的 72 字节限制
bcrypt 会在第 72 个字节处截断输入。长度超过 72 个字符的密码,在前 72 个字节之后的部分会被视为相同。解决方法:先使用 SHA-512 进行预哈希,再使用 bcrypt(但请验证此方案)。
密码验证流程
登录:
1. 用户提交密码
2. 从数据库中取出已存储的哈希值
3. bcrypt.checkpw(submitted, stored_hash)
4. checkpw 从已存储的哈希值中提取盐值并重新计算
5. 返回 True/False
切勿存储原始密码。
基准测试
bcrypt 成本因子为 12:
- 消费级 CPU:每个哈希约 150ms
- GPU(RTX 4090):约 50,000 个哈希/秒(SHA-256 为 10B 个/秒)
使用 bcrypt 成本因子 12 后,攻击者的优势从 10 亿倍降至约 300 倍。
成本因子建议
OWASP 2024:bcrypt 成本因子应 ≥ 10。建议使用 12。每年检查一次——随着硬件性能提升,应提高该因子。实现在线重新哈希:登录时检查哈希值,并在需要时升级。
bcrypt 的局限性
bcrypt 的弱点:它不是内存硬化算法。攻击者可以使用针对 bcrypt 优化的定制 ASIC。对于新应用,建议优先使用 Argon2id,因为它具备内存硬化特性并且能抵抗 ASIC。
快速检查
bcrypt 哈希中的成本因子 12 是什么意思?
回顾
bcrypt 很可靠,但不具备内存硬化特性。接下来我们学习 Argon2——这种现代密码哈希算法支持可配置的内存需求。
常见问题解答
「bcrypt:算法与成本因子」课时是免费的吗?
是的 — 「bcrypt:算法与成本因子」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「bcrypt:算法与成本因子」这节课中我会学到什么?
了解 bcrypt 的内部机制、工作因子以及如何正确调整成本 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「bcrypt:算法与成本因子」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 普通 SHA-256 为何不适合密码
- bcrypt:算法与成本因子
- Argon2:内存困难型密码哈希
- PBKDF2 与算法选择