Secure

发布于

AI总结: 本文介绍了bcrypt哈希算法的结构及其不同版本的特点。一个完整的bcrypt哈希字符串包含算法标识符、成本因子、盐值和哈希值。$2a$是广泛使用的旧版本,存在对非ASCII字符处理不当的问题;$2y$是PHP社区的修复版,主要兼容老旧系统;$2b$是当前推荐的标准,修复了超长密码导致的溢出问题。成本因子影响哈希强度和性能,推荐在生产环境中使用10轮的成本因子,而对于高安全要求场景可以考虑12轮或更高的成本因子,但需评估性能影响。建议进一步明确不同成本因子在实际应用中的具体推荐场景,以帮助用户做出更合适的选择。

bcrypt 哈希算法

一个完整的 bcrypt 哈希字符串通常长这样:
$2a$04$R2lJNvqOXoN.4Cnk/9oDQuUeH6w7E5M8F9G0H1J2K3L4P5O6I7U8i

将其拆解开来:

$2a $ 04 $ R2lJNvqOXoN.4Cnk/9oDQ uUeH6w7E5M8F9G0H1J2K3L4P5O6I7U8i  
|     |    |                     |  
|     |    |                     哈希值(实际密码校验部分)  
|     |    盐值(Salt,22个字符)  
|     成本因子(Cost Factor,2的指数次方,这里=16轮)  
bcrypt算法标识符  

算法标识符

$2a$ (有缺陷的早期标准):这是使用最广泛的旧版本。它修复了最初版本 $2$ 中重复字符串哈希异常的严重漏洞。但它的主要缺陷在于对非ASCII字符(如中文、表情符号)处理不当,且存在密码长度溢出风险。

$2y$ (PHP专用修复版):由 PHP 社区引入,修复了 $2a$ 在高位字符处理上的符号位缺陷。其算法与 $2b$ 等价,通常仅用于兼容老旧的 PHP 系统。

$2b$ (当前官方推荐标准):自 2014 年起成为主流。它修复了超长密码(>255字符)导致的长度环绕溢出问题。如果你现在要创建新密码,直接选用此版本最安全
$2b$ 版本的编码器 可以验证 已有的 $2a$ 格式密码

成本因子

强度值 迭代次数 性能影响 推荐场景 大致耗时
4 16 轮 极快 ❌ 不安全,不推荐 <5ms
8 256 轮 很快 ⚠️ 仅内部测试环境 ~10-20ms
10 1024 轮 中等 ✅ 生产环境默认值 ~50-100ms
12 4096 轮 较慢 ✅ 高安全要求场景 ~200-400ms
14 16384 轮 ⚠️ 需评估性能影响 ~800ms-1.5s