密码学
bcrypt
别称: EksBlowfish 哈希, Provos-Mazières bcrypt
定义
基于 Blowfish 密钥编排、带可调成本参数的自适应口令哈希函数,由 Provos 与 Mazières 于 1999 年提出。
bcrypt 是 Niels Provos 与 David Mazières 在 1999 年发布的口令哈希方案,使用修改版的 Blowfish 密钥编排算法(称为 "EksBlowfish")从带盐口令派生出 192 位的哈希。其成本参数(以 log2 表示的密钥编排迭代次数)允许随着硬件进步逐步提高工作量。bcrypt 输入被硬编码限制为 72 字节,且占用内存较少,因此在面对 GPU/ASIC 攻击时不如内存密集型函数那样强。当前仍被广泛使用,在成本 >= 12 时仍可用于口令存储;但新系统建议优先选择 Argon2id 或 scrypt。
示例
- Django 与 Spring Security 默认使用 bcrypt(成本 12)存储用户口令。
- 典型的 bcrypt 哈希以 $2b$12$ 开头,后跟 22 字符盐和 31 字符摘要。
相关术语
密钥派生函数(KDF)
从口令、共享密钥或主密钥等秘密素材派生出一个或多个强加密密钥的密码学函数。
Argon2
现代的内存密集型口令哈希与密钥派生函数,在 2015 年口令哈希竞赛中胜出,并由 RFC 9106 标准化。
scrypt
由 Colin Percival 于 2009 年设计、由 RFC 7914 标准化的基于口令的内存密集型 KDF,用于口令哈希,也作为部分加密货币的工作量证明算法。
PBKDF2
由 PKCS #5 / RFC 8018 定义的基于口令的密钥派生函数,使用可配置迭代次数和盐反复调用一个伪随机函数。
盐(Salt)
在口令哈希之前与之拼接的唯一随机值,用于抵御彩虹表并使每个用户的哈希都不同。
Blowfish
Bruce Schneier 于 1993 年设计的 Feistel 分组密码,分组长度 64 位、密钥长度可变;算法本身安全,但因分组过小已被 AES 取代。