36、PHP 8.4 方法或功能修改 - 密码哈希:默认 Bcrypt 成本从 10 更改为 12
在 PHP 8.4 中,密码哈希(Password Hashing)功能的默认 Bcrypt 成本因子(cost factor)从原来的 10 调整为 12。这个变更对使用 PHP 内建 password_hash()
函数进行密码哈希处理的用户具有一定影响。
Bcrypt 哈希算法
Bcrypt 是一种广泛使用的密码哈希算法,基于 Blowfish 加密算法,设计时考虑了抗 GPU 破解(通过引入计算延迟)和抗暴力破解的能力。Bcrypt 的哈希过程需要设置一个成本因子(Cost Factor),它决定了计算哈希时所需要的计算量。成本因子越高,计算的时间和资源消耗就越大。
成本因子(Cost Factor)
成本因子决定了哈希过程的计算复杂度。具体来说,Bcrypt 成本因子是 2 的某个指数值。比如,成本因子为 10 表示哈希计算需要进行 2 的 10 次方(1024)次计算迭代,成本因子为 12 则意味着计算需要进行 2 的 12 次方(4096)次迭代。
- 成本因子值较小,意味着哈希计算较快,但同时也意味着攻击者可以在较短时间内尝试更多的密码。
- 成本因子值较大,意味着哈希计算需要更多时间,但也会增加暴力破解的难度。
PHP 8.4 中的变化
在 PHP 8.4 版本中,password_hash()
函数默认使用的 Bcrypt 成本因子由原来的 10 调整为 12。
- PHP 8.3 及之前:默认成本因子是 10。
- PHP 8.4:默认成本因子改为 12。
这意味着,在 PHP 8.4 版本中,使用 password_hash()
函数生成的 Bcrypt 哈希将比之前更为复杂,需要更多的计算资源和时间。虽然这种更改有助于提高安全性,但也会导致哈希计算的时间增加,尤其是在计算能力较弱的环境中。
影响和优势
安全性提高
增加 Bcrypt 的成本因子意味着哈希过程更加耗时,暴力破解的难度大大增加,尤其是在计算能力较强的攻击者尝试暴力破解时。随着时间的推移,硬件性能逐渐提高,因此将成本因子提高是一个逐渐增加安全性的好方法。
- 安全性提升:随着攻击者硬件性能的提升,增加成本因子有助于抵御通过现代硬件进行的暴力破解攻击。
- 更强的抗破解性:在相同的计算环境下,哈希计算的时间变长,攻击者尝试的速度变慢,破解密码所需的时间显著增加。
性能影响
增加成本因子虽然有助于提升安全性,但也会对性能造成影响。尤其是在资源受限的服务器(例如低配置的虚拟主机)上,计算 Bcrypt 哈希时会变得更加耗时。对于每个密码哈希操作,时间和 CPU 的消耗会增加,这可能影响到系统的整体响应时间,尤其是当网站有大量用户登录和注册请求时。
兼容性问题
如果你使用了 PHP 8.4 或更高版本,但你的用户数据库中已经存储了使用旧成本因子(例如 10)生成的哈希密码,则 PHP 8.4 默认的成本因子(12)不会直接影响现有的密码哈希。只有当用户尝试使用他们的密码登录时,password_verify()
会验证密码并自动更新其哈希为新的默认成本因子。
不过,如果你的应用需要兼容低成本因子的旧版哈希(如成本因子为 10),你可以显式地在调用 password_hash()
时指定成本因子:
// 明确指定成本因子为 10
$passwordHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
整成本因子
如果你希望调整成本因子,可以通过第三个参数在 password_hash()
函数中显式地设置。此参数是一个关联数组,可以设置 cost
选项。即使 PHP 8.4 中的默认成本因子是 12,你仍然可以选择使用不同的成本因子。
php复制代码// 显式指定成本因子为 14,增加安全性但提高计算时间
$passwordHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 14]);
// 显式指定成本因子为 8,减轻计算负担
$passwordHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 8]);