Skip to main content
CheckTown
开发工具

bcrypt:密码哈希如何工作,以及它为何重要

发布于 阅读约 7 分钟
本文目录

什么是 bcrypt?

bcrypt 是一种自适应的密码哈希函数,由 Niels Provos 和 David Mazieres 于 1999 年设计。bcrypt 基于 Blowfish 密码算法,融入盐值以抵御彩虹表攻击,并采用可配置的成本因子(工作因子)来控制计算该哈希的开销有多大。这使得 bcrypt 有意变慢 —— 而这种缓慢正是它的核心安全特性。

与 MD5 或 SHA-256 等(为数据完整性而设计的)快速哈希函数不同,bcrypt 是专为密码存储而设计的。它的自适应特性意味着可以随着硬件变快而逐步提高成本因子,从而即便面对现代计算能力,也能让暴力破解攻击难以实施。

bcrypt 的工作原理

一个 bcrypt 哈希在单个字符串中包含了验证密码所需的全部信息。其格式为 $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy,其中每一部分都有特定含义。

  • $2b$ —— 算法标识符,表示 bcrypt 2b 版本(当前推荐的版本)
  • 10$ —— 成本因子(2^10 = 1024 轮密钥派生函数)
  • N9qo8uLOickgx2ZMRZoMye —— 22 个字符、经 Base64 编码的盐值(128 位随机数)
  • IjZAgcfl7p92ldGxad68LJZdL17lhWy —— 31 个字符、经 Base64 编码的哈希输出

免费试用 —— 无需注册

生成 bcrypt 哈希 →

选择合适的成本因子

成本因子(也称轮数或工作因子)决定了 bcrypt 内部执行多少次迭代。每增加 1,计算时间就翻倍。成本因子为 10 意味着 2^10 = 1024 次迭代;成本因子为 12 意味着 2^12 = 4096 次迭代 —— 比 10 慢四倍。

目标是让哈希计算慢到足以阻止暴力破解攻击,同时又快到不会在登录时损害用户体验。大多数安全专家推荐生产应用程序使用 10 到 12 之间的成本因子。

  • 成本 10 —— 哈希耗时约 100 毫秒;适合大多数 Web 应用程序的良好基线
  • 成本 12 —— 哈希耗时约 300-400 毫秒;推荐用于银行或医疗等高安全性应用程序
  • 成本 14 及以上 —— 哈希耗时 1 秒或更长;对交互式登录而言通常过慢,但可能适用于管理员账户或密钥派生

bcrypt 与其他哈希算法的对比

并非所有哈希算法都适合用于密码存储。MD5 和 SHA-256 等快速哈希函数在现代 GPU 上每秒可计算数十亿个哈希,使它们易受暴力破解攻击。而 bcrypt、scrypt 和 Argon2 等专用于密码的函数则是有意变慢的。

  • MD5/SHA-256 —— 为速度而非密码安全设计;在 GPU 上每秒可暴力破解数十亿个哈希;切勿用于密码
  • bcrypt —— CPU 密集型,自 1999 年起久经考验,在所有主流编程语言中都得到广泛支持;密码哈希的默认推荐方案
  • Argon2 —— 在 2015 年赢得了密码哈希竞赛;内存密集型(比 bcrypt 更能抵御 GPU 攻击);若有库支持,推荐用于新项目

常见使用场景

只要密码需要被安全存储,就会用到 bcrypt。先哈希再验证的工作流是标准模式。

  • 用户注册 —— 在把密码存入数据库之前先用 bcrypt 哈希;切勿存储明文密码
  • 登录验证 —— 用相同的盐值和成本因子对提交的密码进行哈希,然后使用恒定时间比较函数将其与已存储的哈希进行比对
  • 密码迁移 —— 从 MD5/SHA 升级到 bcrypt 时,在用户下次成功登录时重新哈希其密码;标记出仍在使用旧哈希格式的账户

常见问题

我能在不重置密码的情况下更改成本因子吗?

可以。在每次成功登录时,检查已存储的哈希是否使用了旧的成本因子。如果是,就用新的成本因子重新哈希密码(登录期间你手里有明文密码)并更新数据库。这称为机会性重新哈希,它允许在不强制重置密码的情况下逐步迁移。

如何针对一个 bcrypt 哈希验证密码?

bcrypt 哈希字符串包含算法版本、成本因子和盐值。验证函数会提取这些信息,用相同的参数对候选密码进行哈希,然后使用恒定时间比较来比对结果,以防止时序攻击。在 Node.js 中,使用 bcrypt.compare();在 Python 中,使用 bcrypt.checkpw()。

我应该用 bcrypt 还是 Argon2?

两者都是极佳的选择。bcrypt 历经 25 年的考验,拥有普遍的库支持。Argon2 更新,属于内存密集型(更能抵御 GPU 攻击),并赢得了密码哈希竞赛。对于新项目,如果你的平台对其支持良好,推荐选择 Argon2id。对于现有项目,只要配置的成本因子为 10 或更高,bcrypt 依然完全安全。

相关工具