如果他们更改 PHP 密码库中的 PASSWORD_DEFAULT 会发生啥?
Posted
技术标签:
【中文标题】如果他们更改 PHP 密码库中的 PASSWORD_DEFAULT 会发生啥?【英文标题】:What will happen if they changed PASSWORD_DEFAULT in PHP Password library?如果他们更改 PHP 密码库中的 PASSWORD_DEFAULT 会发生什么? 【发布时间】:2015-08-16 14:53:46 【问题描述】:使用 php 考虑这行代码:
$password = password_hash($password, PASSWORD_DEFAULT);
如果他们更改了默认密码哈希算法会发生什么?我的意思是我将在数据库中使用散列密码。那么,根据我自己的理解,将无法检查密码,因为哈希算法将完全改变。
【问题讨论】:
【参考方案1】:很明显,新散列的密码将使用新算法。
但是,您不必担心这一点,因为整个设计都考虑到了前向兼容性 - 只要您使用 @987654321,当默认算法更改时,您的代码就不会被破坏@ 功能正确。
正确地说,我的意思是使用password_verify()
。
password_verify()
接受纯文本密码和哈希,它可以通过查看您提供的哈希轻松确定使用的算法是什么。因此,它仍然能够验证已使用旧算法进行哈希处理的密码 - 不仅是以前的算法,还包括任何受支持的算法。
事实上,PASSWORD_DEFAULT
常量的唯一目的是您可以轻松地将旧哈希迁移到新算法(一旦添加)。这会通过以下方式发生:
password_verify()
验证他们的密码(任何具有PASSWORD_<name>
常量的哈希算法都可以使用)。
您调用password_needs_rehash()
,如果您刚刚验证的密码使用的是较旧的算法(或较低的“成本”参数),它将返回布尔值TRUE。
如果确实返回了布尔值 TRUE,您现在可以将旧哈希替换为使用新算法的哈希;您可以在登录期间执行此操作,因为用户刚刚给了您密码并且您验证了它是正确的。
总而言之 - 这是一个非常、非常精心设计的 API,它为您解决了您甚至没有想过的问题。不用担心。
编辑(在 cmets 中注明):
然而,应该注意的是,新算法很可能会导致更长的哈希长度,所以如果您将密码存储在数据库中 - 不要限制字段的长度(即使用 varchar(255)
字段) .
【讨论】:
谢谢。这很有帮助。 实际上有一个重要的区别可能导致一些新的哈希无法验证。由于我们不知道将来会使用什么算法,这可能意味着哈希长度可能会改变。这就是手册建议使用VARCHAR(255)
存储哈希的原因,即使 bcrypt 哈希最大长度约为 55 个字符。
真的是他们应该在 php 文档中解释的东西!这是一个非常好的行为,但在password_hash
和password_verify
他们没有提到password_needs_rehash
【参考方案2】:
为了澄清,我想补充一下 PHP 使用以下结构的答案。因此,password_needs_rehash()
和 password_verify()
函数将检查算法和成本,并尽其所能保持一切兼容和正确。
来源:http://php.net/manual/en/faq.passwords.php
【讨论】:
以上是关于如果他们更改 PHP 密码库中的 PASSWORD_DEFAULT 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章