首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP5.5中使用password_needs_rehash函数

如何在PHP5.5中使用password_needs_rehash函数
EN

Stack Overflow用户
提问于 2013-09-27 15:39:51
回答 3查看 2.7K关注 0票数 6

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

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

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

代码语言:javascript
复制
if (password_needs_rehash ($current_hash, PASSWORD_BCRYPT)) {
  // update the password using password_hash
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-27 15:44:18

是的,这就是一般的想法。

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

代码语言:javascript
复制
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
  ...
}
票数 5
EN

Stack Overflow用户

发布于 2013-09-27 15:45:48

是的,没错。您可能希望设置的唯一选项是“成本”,它表示生成哈希所需的工作量(因此它很难破解)。对于bcrypt,成本默认为10,但可以增加,以使哈希更难破解。因此,您可以在这里将“成本”设置为11,并在生成新哈希时使用相同的值。这样做的好处是,您以后可以将其更改为12,并且它将升级已经在bcrypt上的现有散列,但只需花费11。

票数 2
EN

Stack Overflow用户

发布于 2016-02-08 09:40:45

试试这个:

代码语言:javascript
复制
$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
    }
}

Ps。如果你想自己放盐..。请不要那样做。您不会比本地password_hash(.)做得更好。php函数。只需设置成本,这将在检查速度和安全性之间提供不受暴力胁迫的平衡。如果将选项留空,默认情况下成本将设置为10。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19054810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档