Skip to content
crypto2026-07-253 分钟阅读

什么是 Bcrypt

Bcrypt 是基于 Blowfish 加密算法的密码哈希函数,由 Niels Provos 和 David Mazières 于 1999 年设计。它被公认为密码哈希的黄金标准,广泛应用于用户密码存储场景。

与普通哈希(如 SHA-256)不同,Bcrypt 专门为密码存储设计,内置了盐值生成和可调节的工作因子。

为什么需要 Bcrypt

  1. 抵抗暴力破解:可调节的计算成本让暴力破解变得不切实际
  2. 内置盐值:每次哈希自动生成随机盐值,防止彩虹表攻击
  3. 工作因子可调:随着硬件性能提升,可以增加计算成本
  4. 时间-成本权衡:合法用户登录只需几百毫秒,但攻击者尝试十亿次密码需要数百年

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 哈希工具

生成哈希

  1. 输入明文密码
  2. 选择工作因子(默认 10)
  3. 点击 Hash 按钮
  4. 复制生成的 Bcrypt 哈希值

验证密码

  1. 输入 Bcrypt 哈希值
  2. 输入待验证的密码
  3. 点击 Verify 按钮
  4. 工具显示密码是否匹配

代码示例

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 | 可调 | ✅ 内置 | ✅ | ✅ 成熟可靠 |

安全最佳实践

  1. 永远不要存储明文密码:使用 Bcrypt 或 Argon2 哈希
  2. 不要限制密码长度:Bcrypt 截断 72 字节,但应允许用户输入更长密码
  3. 定期提高工作因子:随着硬件升级,增加成本因子
  4. 密码修改时重新哈希:用户修改密码后生成新的哈希值
  5. 使用常量时间比较:验证时使用 timingSafeEqual 防止时序攻击

FAQ

Bcrypt 和 Argon2 哪个更好?

Argon2 是 2015 年密码哈希竞赛的获胜者,理论上更安全(抗 GPU/ASIC 攻击)。但 Bcrypt 经过 25 年实战检验,更成熟可靠。新项目推荐 Argon2,现有项目无需迁移。

为什么 Bcrypt 哈希每次结果不同?

Bcrypt 每次自动生成随机盐值,即使输入相同密码,输出的哈希值也不同。验证时通过盐值重新计算来比对。

工作因子设多少合适?

选择让用户登录耗时 100-300ms 的值。2024 年推荐 10-12。随着硬件升级,未来可能需要提高。


本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页


ad