如果他们更改 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
使用 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