如果他们更改 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_hashpassword_verify 他们没有提到password_needs_rehash【参考方案2】:

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

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

【讨论】:

以上是关于如果他们更改 PHP 密码库中的 PASSWORD_DEFAULT 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

在不知道现有密码 PHP 的情况下更改 oracle db 用户密码

PDO PHP UPDATE 不更新密码,如果不包括在内

Rails 4 - 仅当当前密码正确时才允许更改密码

PHP中的密码安全性

PHP和恢复密码过程

如何在Rails 5中更改设计中的验证错误消息