我的数据库中有一组密码,我之前使用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
}
答案 0 :(得分:5)
是的,这是一般的想法。
如果需要重新设置密码,则只需调用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
...
}
答案 1 :(得分:2)
是的,这是正确的。您可能想要设置的唯一选项是“cost”,表示生成哈希需要多少工作(因此破解的难度)。 bcrypt的成本默认为10,但可以增加以使哈希更难破解。因此,您可以在此处将“cost”设置为11,并在生成新哈希时使用相同的值。这样做的好处是,您可以稍后将其更改为12,并且它将升级已经在bcrypt上的现有哈希值,但只需要成本为11。
答案 2 :(得分: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.