PHP的密码_hash()是否向后兼容?

时间:2017-09-03 13:37:10

标签: php php-password-hash

具体来说,使用PASSWORD_DEFAULT算法时,根据php page

"请注意,此常量旨在随着时间的推移而改变,因为新的和更强大的算法被添加到PHP中。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在数据库列中,该列可以扩展到超过60个字符(255个字符将是一个不错的选择)。"

"注意:此功能对支持的算法的更新(或对默认算法的更改)必须遵循以下规则: 在成为默认值之前,任何新算法必须在核心中至少有1个完整版本的PHP。因此,例如,如果在7.5.5中添加了新算法,则在7.7之前它将不具有默认条件(因为7.6将是第一个完整版本)。但是如果在7.6.0中添加了不同的算法,它也可以默认为7.7.0。 默认值只应在完整版本(7.3.0,8.0.0等)中更改,而不能在修订版本中更改。唯一的例外是在紧急情况下,当前默认情况下发现严重的安全漏洞。"

因此,在将PHP升级到对PASSWORD_DEFAULT使用不同算法的版本时,是否会阻止用户在使用旧算法对其密码进行哈希处理时登录?

2 个答案:

答案 0 :(得分:1)

是一种单向散列算法,您无法解密散列。

如果密码与存储的哈希匹配,请使用password_verify检查:

<?php
  $hash = 'your-hash';

  if (password_verify('pass', $hash)) {
    echo 'Password is valid';
  } else {
    echo 'Password is not valid!'; 
  }

答案 1 :(得分:1)

简短的回答是肯定的,它是向后兼容的,只要你的存储允许更长的密码哈希长度。

生成密码时,您将以特定格式获取密码。

我使用bcrypt和较新的argon2i哈希生成了两个密码。 (在PHP 7.2中引入libsodium

仅供参考:我的代码基于libsodium扩展,因为我没有下载php 7.2,并且只是为了别名而安装sodium_compat。 php 7.2语法不包含任何名称空间。

$bcrypt = password_hash('insecurepassword', PASSWORD_BCRYPT);
$argon2i = \Sodium\crypto_pwhash_str('insecurepassword', \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);

var_dump($bcrypt, $argon2i);

我跑的时候得到的输出就是这个

string(60) "$2y$10$jiT0NF3u426kguHes8ZBputRE/n9OSdPi5HhHvEWW4mX1XDwKwy1e"
string(96) "$argon2i$v=19$m=32768,t=4,p=1$Ho4Vzgp5nzQkLlp99P+ViA$bDqX8UUlSnfLRCfFBzBnFhWr/hzHzuuUCfZ0LSIns64"

两个密码的格式或多或少都相同。如果您爆炸$,您最终会得到验证密码所需的每个拼图。

第一部分包含算法。 2ybcrypt,{ - 1}}为{argon2i}。 (惊喜!)

接下来的位包含配置选项,因此在argon2i的情况下包含成本。在bcrypt的情况下,还有一些额外的配置。

最后一节包含要检查的算法的实际密码和salt。

对于更多的视觉细分检查php docs

尽管我已经使用了一些不同的函数来演示某些输出,但是有一个rfc被接受,它引入了argon2i哈希对argon2i函数的支持。 7.2。

所以当那个时候到来时,password_hash将会#34;只是工作&#34;无论您是否为其提供password_verifybcrypt哈希以验证密码。