如果他们在PHP密码库中更改了PASSWORD_DEFAULT,会发生什么?

Amb*_*ons 9 php passwords hash php-password-hash

使用PHP考虑这行代码:

$password = password_hash($password, PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)

如果他们更改了默认密码哈希算法会发生什么?我的意思是我将在数据库中使用哈希密码.然后,根据我自己的理解,检查密码是不可能的,因为哈希算法将完全改变.

Nar*_*arf 10

接下来会发生的是,新散列的密码将使用新算法 - 显然.

但是,您不应该担心这一点,因为整个事情的设计都考虑了前向兼容性 - 只要您password_*()正确使用这些函数,默认算法更改时您的代码就不会被破坏.
通过正确,我的意思是使用password_verify().

password_verify()接受纯文本密码和哈希,它可以通过查看您提供的哈希来轻松确定所使用的算法是什么.因此,它仍然能够验证使用旧算法进行哈希处理的密码 - 不仅仅是前一个算法,而是任何支持的算法.

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

  • 当用户登录时,您可以通过password_verify()(任何具有PASSWORD_<name>常量的散列算法)验证其密码.
  • 你打电话password_needs_rehash(),如果你刚验证的密码是使用较旧的算法(或较低的'cost'参数),它将返回布尔值TRUE.
    • 如果确实返回了布尔值TRUE,那么现在可以将旧哈希替换为使用新算法的哈希值; 您可以在登录期间执行此操作,因为用户只是给了您密码并且您确认它是正确的.

总而言之 - 它是一个非常,非常精心设计的API,它解决了你甚至没想过的问题.别担心.

编辑(在评论中注明):

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


小智 5

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

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

PHP哈希密码结构