2013-09-27 4 views
6

У меня есть набор паролей в моей базе данных, которые я ранее использовал с помощью sha512, и теперь, когда я обновил свой сервер до PHP 5.5, я хотел бы использовать хэширование пароля bcrypt. Так что моя идея заключается в том, чтобы иметь логин пользователя, а затем вызвать эту password_needs_rehash функцию, описанную здесь, чтобы проверить пароль, а затем обновить хэш пароля в базе данных:Как использовать функцию password_needs_rehash в PHP 5.5

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

от внешнего вида да, это правильно – exussum

ответ

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 
    ... 
} 
2

Да, это правильно. Единственный вариант, который вы, возможно, захотите установить, - это «стоимость», обозначая, сколько работы требуется для генерации хэша (и, следовательно, насколько сложно его взломать). Стоимость по умолчанию равна 10 для bcrypt, но может быть увеличена, чтобы сделать хэши более трудными для взлома. Таким образом, вы можете установить «стоимость» здесь 11 и использовать одно и то же значение при создании новых хешей. Преимущество этого в том, что вы можете позже изменить его на 12 лет, и было бы модернизировать существующие хэши, которые уже были на Bcrypt, но только со стоимостью 11.

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 
    } 
} 

Ps. Если вы думаете о настройке своей соли ... пожалуйста, не делайте этого. Вы не будете делать это лучше, чем собственная функция password_hash (...) php. Просто установите стоимость, которая обеспечивает баланс между скоростью проверки и защитой от принудительного форсирования. Если вы оставите опции пустыми, стоимость по умолчанию будет установлена ​​на 10.