7

我的数据库中有一组密码,我之前使用 sha512 进行了散列,现在我已经将服务器升级到 PHP 5.5,我想使用 bcrypt 密码散列。所以我的想法是让用户登录,然后调用这里描述的这个 password_needs_rehash 函数来检查密码,然后更新数据库中的密码哈希:

http://php.net/manual/en/function.password-needs-rehash.php

我不确定如何使用这个函数,这里没有列出示例,也没有真正阐明选项数组的用途。我是否只需要像这样调用 password_needs_rehash 函数:

if (password_needs_rehash ($current_hash, PASSWORD_BCRYPT)) {
  // update the password using password_hash
}
4

3 回答 3

6

是的,这是一般的想法。

如果密码需要重新散列,那么您只需调用重新散列password_hash()即可。当然,将新的哈希值保存在您的数据库中。

if (password_needs_rehash ($current_hash, PASSWORD_BCRYPT)) {
  // update the password using password_hash
  $new_hash = password_hash($cleartext_password, PASSWORD_BCRYPT)
  // update the database
  ...
}
于 2013-09-27T15:44:18.783 回答
2

对,那是正确的。您可能要设置的唯一选项是“成本”,表示生成哈希需要多少工作(以及因此破解的难度)。bcrypt 的成本默认为 10,但可以增加成本以使哈希更难破解。因此,您可以在此处将“成本”设置为 11,并在生成新哈希时使用相同的值。这样做的好处是您可以稍后将其更改为 12,并且它将升级已经在 bcrypt 上但成本仅为 11 的现有哈希。

于 2013-09-27T15:45:48.367 回答
1

尝试这个:

$passwordFromDatabase = "A1D292F556AA661B720847487960860F17086A0BD11A4320368E9447FF7139DE089AA88B6159420814F10194F1AA55A3379FB80EA26BA6397BA75CEC811B241A"; // sha512 hash of "somepassword"
$passwordFromForm = $_POST['password']; // $_POST['password'] == "somepassword"

if(password_needs_rehash($passwordFromDatabase, PASSWORD_BCRYPT, ["cost" => 12]) && hash("sha512", $passwordFromForm) === $passwordFromDatabase){
    // generate new password hash
    $newPasswordHash = password_hash($passwordFromForm, PASSWORD_BCRYPT, ["cost" => 12]);
    // update hash from database - replace old hash $passwordFromDatabase with new hash $newPasswordHash
    // after update login user
    if(password_verify($passwordFromForm, $newPasswordHash)){
        // user has logged in successful and hash was updated
        // redirect to user area
    }else{
        // ups something went wrong Exception
    }
}else{
    if(password_verify($passwordFromForm, $passwordFromDatabase)){
        // user password hash from database is already BCRYPTed no need to rehash
        // user has logged in successfully
        // redirect to user area
    }else{
        // wrong password
        // no access granted - stay where you are
    }
}

附言。如果您考虑设置自己的盐...请不要这样做。您不会比本机 password_hash(...) php 函数做得更好。只需设置在检查速度和针对暴力破解的安全性之间提供平衡的成本。如果您将选项留空,则默认情况下成本将设置为 10。

于 2016-02-08T09:40:45.313 回答