Skip to content
Vol. 1 · Ed. 2026
CyberGlossary
Entry № 105

bcrypt

审核人Cybersecurity entrepreneur & security researcher

bcrypt 是什么?

bcrypt基于 Blowfish 密钥编排、带可调成本参数的自适应口令哈希函数,由 Provos 与 Mazières 于 1999 年提出。


bcrypt 是 Niels Provos 与 David Mazières 在 1999 年发布的口令哈希方案(USENIX 论文 "A Future-Adaptable Password Scheme"),它使用修改版的 Blowfish 密钥编排算法(称为 "EksBlowfish")从带盐口令派生出 192 位的哈希。开销高昂的密钥建立阶段通过反复的密钥扩展将盐与口令交错混合,然后把常量字符串 "OrpheanBeholderScryDoubt" 加密 64 次。其成本参数(密钥建立轮数的 log2)使防御方能够随着硬件进步提高工作量;成本 12 意味着 2^12 = 4096 次迭代。

bcrypt 的一个标志性怪癖是其硬性的 72 字节输入上限:超过第 72 字节的一切内容都会被静默截断。这正是导致 2024 年 10 月 Okta AD/LDAP 委托认证事件的原因——Okta 通过对 userId + username + password 做 bcrypt 哈希来构建缓存键;对于用户名长度达到 52 个及以上字符的用户,口令落在了 72 字节的截断点之外而被忽略,从而使先前缓存的凭据得以通过认证。教训是:在 bcrypt 之前对较长输入进行预哈希(例如先做 SHA-256 再做 Base64),或改用没有该限制的函数。

bcrypt 占用的内存小且固定,这也使它在面对 GPU/ASIC 破解时比内存密集型设计更弱。在成本 >= 12 时它仍可接受,但 OWASP 现在建议新系统采用 Argon2id(或 scrypt)。

flowchart TD
  P[Password + 128-bit salt] --> T{Input > 72 bytes?}
  T -->|Yes| TR[Bytes 73+ silently truncated]
  T -->|No| K
  TR --> K[EksBlowfish key setup]
  K --> C[Cost: repeat key schedule 2^cost times]
  C --> E["Encrypt 'OrpheanBeholderScryDoubt' x64"]
  E --> H["$2b$12$salt + 184-bit digest"]

示例

  1. 01

    Django 与 Spring Security 默认使用 bcrypt(成本 12)存储用户口令。

  2. 02

    典型的 bcrypt 哈希以 $2b$12$ 开头,后跟 22 字符盐和 31 字符摘要。

常见问题

bcrypt 是什么?

基于 Blowfish 密钥编排、带可调成本参数的自适应口令哈希函数,由 Provos 与 Mazières 于 1999 年提出。 它属于网络安全的 密码学 分类。

bcrypt 是什么意思?

基于 Blowfish 密钥编排、带可调成本参数的自适应口令哈希函数,由 Provos 与 Mazières 于 1999 年提出。

如何防御 bcrypt?

针对 bcrypt 的防御通常结合技术控制与运营实践,详见上方完整定义。

bcrypt 还有哪些其他名称?

常见的别称包括: EksBlowfish 哈希, Provos-Mazières bcrypt。

相关术语

另见