使用PHP考虑这行代码:
$password = password_hash($password, PASSWORD_DEFAULT);
如果他们更改了默认密码哈希算法会发生什么?我的意思是我将在数据库中使用哈希密码。然后,根据我自己的理解,检查密码是不可能的,因为哈希算法将完全改变。
答案 0 :(得分:9)
新的哈希密码将会使用新算法 - 显然。
但是,你不应该担心这一点,因为整个过程都考虑到了前向兼容性 - 当你的默认算法发生变化时你的代码就会被破坏,只要你&#39 ;正确使用password_*()
功能。
正确地说,我的意思是使用password_verify()
。
password_verify()
接受纯文本密码和哈希,它可以通过查看您提供的哈希来轻松确定所使用的算法是什么。因此,它仍然能够验证使用旧算法进行哈希处理的密码 - 不仅仅是前一个算法,而是任何支持的算法。
事实上,PASSWORD_DEFAULT
常量的唯一目的是您可以轻松地将较旧的哈希值迁移到新算法(一旦添加一个)。这种情况发生在以下方面:
password_verify()
验证其密码(任何具有PASSWORD_<name>
常量的散列算法都可以使用。)password_needs_rehash()
,如果您刚验证的密码使用较旧的算法(或较低的费用&#39;参数),则会返回布尔值TRUE。
编辑(在评论中注明):
然而,应该注意的是,新算法很可能会导致较长的哈希长度,因此如果您将密码存储在数据库中 - 请勿限制字段的长度(即使用varchar(255)
字段。
答案 1 :(得分:4)
为了澄清,我想补充说PHP使用以下结构的答案。因此,password_needs_rehash()
和password_verify()
函数将检查算法和成本,并开展工作以保持所有内容的兼容性和正确性。