当第一个password_hash已经有效时,是否需要再次使用password_hash?我是新手

时间:2016-08-28 06:26:50

标签: php hash passwords bcrypt php-password-hash

我阅读并阅读了有关password_hash的PHP文档,并得到了这个:

    <?php
// first determine if a supplied password is valid
$options = ['cost' => 12,];

$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);
if (password_verify($plaintextPassword, $hashedPassword)) {

    // now determine if the existing hash was created with an algorithm that is
    // no longer the default
    if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {

        // create a new hash with the new default
        $newHashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT);

        // and then save it to your data store
        //$db->update(...);
    }
}
?>

我真的想知道当第一个哈希已经有效时,是否有必要再次使用hash_password。

2 个答案:

答案 0 :(得分:1)

第二项检查是查看密码是否使用当前的PASSWORD_DEFAULT加密。

与密码检查相比,它更像是PHP兼容性/持续安全性。

看看: http://php.net/manual/en/function.password-hash.php

md5($password)的旧时代已经过去了......

答案 1 :(得分:1)

从技术上讲,第二次调用password_hash不是必需的。尽管如此,它非常有用,不应该被省略!正如Mark已经提到的,第二次调用有助于使存储的哈希值保持最新。

但是你的代码片段中存在一个非常重要的缺陷。您从文档中复制的部分很好,但是扩展它的方式不正确。 那么发生了什么?第一次调用password_hash会从明文密码创建一个哈希。然后使用参数password_verify$plaintextPassword调用$hashedPassword。这是有问题的部分。此调用将始终生成TRUE,因为您要验证明文密码是否与刚创建的自身哈希相匹配。这永远不会失败,最终使这种情况变得毫无用处。

错误是你第一次调用password_hash。此时你不会哈希$plaintextPassword。相反,您应该从数据库中检索已存储的该用户的密码哈希值。接下来,您将以这样的方式调用password_verifypassword_verify($plaintextPassword, $hashedPasswordFromDatabase))。这可以确保输入的明文密码与您已知的密码哈希相匹配。

// drop that line
//$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options); 

// and replace it with something like this
$hashedPasswordFromDatabase = $db->getPasswordHashForUserId(42);

// match the plaintext pw an the pw from db 
if (password_verify($plaintextPassword, $hashedPasswordFromDatabase)) 
{
    ...

然后password_needs_rehash检查密码哈希(取自数据库)是否仍然是最新的。如果发现哈希值已弃用,则条件成立并再次调用password_hash。要了解这有用的原因,请想象以下内容:您将在下一天发布您的网站。用户创建帐户,currently active hashing-algorithm CRYPT_BLOWFISH用于创建用户&#39;哈希值。您的网站变得如此成功,它在2020年仍然活跃。到那时(很可能更早),更好的散列算法成为默认。新用户&#39;然后,密码将自动使用更好的算法创建,因为您使用常量PASSWORD_DEFAULT将返回另一个PHP版本中的其他散列算法。对于新用户,这很好。但是已经存在的用户&#39;如果您没有在代码中第二次调用password_hash,则密码将不会重新并且几乎不会更新

长话短说:在您的代码段中进行第二次调用,以使您的代码更具面向未来。

解决您的其他问题:

12的费用现在可能没问题,但这是您应该不时调整的价值。取from the docs

  

建议您在服务器上测试此功能,并调整cost参数,以便在交互式系统上执行该功能的时间少于100毫秒。

因此,您应该增加它,以便在服务器硬件上产生所需的延迟。但是请注意,将could make you vulnerable增加到拒绝服务攻击的程度。

有关密码散列的详细介绍,请查看crackstation上的这篇精彩文章:https://crackstation.net/hashing-security.htm