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

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 に設定されます。

于 2016-02-08T09:40:45.313 に答える