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 |