如果他们更改 PHP 密码库中的 PASSWORD_DEFAULT 会怎样?

What will happen if they changed PASSWORD_DEFAULT in PHP Password library?

使用 PHP:

考虑这行代码
$password = password_hash($password, PASSWORD_DEFAULT);

如果他们更改默认的密码哈希算法会怎样?我的意思是我将在数据库中使用散列密码。然后,根据我自己的理解,将无法检查密码,因为哈希算法将完全改变。

显然,新散列的密码将使用新算法。

但是,您不必担心这一点,因为整个设计都考虑了向前兼容性 - 只要您使用password_*() 功能正常。
正确的意思是使用 password_verify().

password_verify() 接受纯文本密码和散列,它可以通过查看您提供的散列轻松确定使用的算法。因此,它仍然能够验证使用旧算法散列的密码 - 不仅仅是以前的算法,而是支持的任何算法。

事实上,PASSWORD_DEFAULT 常量的唯一目的是您可以轻松地将旧的哈希迁移到新算法(一旦添加)。这是通过以下方式发生的:

  • 当用户登录时,您通过 password_verify() 验证他们的密码(任何具有 PASSWORD_<name> 常量的哈希算法都可以)。
  • 您调用 password_needs_rehash(),如果您刚刚验证的密码使用旧算法(或较低的 'cost' 参数)- 它将 return 布尔值 TRUE。
    • 如果 boolean TRUE 确实被 returned,您现在可以用使用新算法的哈希值替换旧的哈希值;您可以在登录期间执行此操作,因为用户刚刚给了您密码并且您验证了它是正确的。

总而言之 - 这是一个非常真正 精心设计的API,它为您解决了您甚至没有想过的问题。不用担心。

编辑(在评论中注明):

然而,应该注意的是,新算法很可能会导致更长的散列长度,因此如果您将密码存储在数据库中 - 不要限制字段的长度(即使用 varchar(255) 字段).

为了澄清起见,我想补充一下 PHP 使用以下结构的答案。因此,password_needs_rehash()password_verify() 函数将检查算法和成本并完成它们的工作以保持一切兼容和正确。

来源:http://php.net/manual/en/faq.passwords.php