passwords - Laravel password_hash - PHPでパスワードのハッシュ化にbcryptを使うには? #3

Password_verify / php / cryptography / password-protection / bcrypt

Read Question

Peter Mortensen



Answer #3

PHP 5.5 から、パスワードのハッシュ化のための新しい API が導入されます。また、5.3.7 以降では (私が)管理している shim 互換ライブラリがあります。これには、査読を経たシンプルな実装であるという利点があります。

function register($username, $password) {
    $hash = password_hash($password, PASSWORD_BCRYPT);
    save($username, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    if (password_verify($password, $hash)) {
        //ログインする
    } else {
        //失敗
    }
}

これは、PHP 5.5 のものに似た別の API であり、同様の目的を持っています。

function register($username, $password) {
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    $hash = $bcrypt->create($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    if ($bcrypt->verify($password, $hash)) {
        //ログインする
    } else {
        //失敗
    }
}

これは、パスワードのハッシュ化に対して少し異なるアプローチです。単に bcrypt をサポートするのではなく、PasswordLib は多数のハッシュ アルゴリズムをサポートしています。これは主に、自分ではコントロールできないレガシーで異質なシステムとの互換性をサポートする必要がある場合に役立ちます。多数のハッシュアルゴリズムをサポートしています。また、5.3.2+をサポートしています。

function register($username, $password) {
    $lib = new PasswordLib\PasswordLib();
    $hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $lib = new PasswordLib\PasswordLib();
    if ($lib->verifyPasswordHash($password, $hash)) {
        //ログインする
    } else {
        //失敗
    }
}

これはbcryptをサポートするレイヤーですが、PHP> = 5.3.2にアクセスできない場合に役立つかなり強力なアルゴリズムもサポートしています...実際にはPHP3.0 +をサポートしています(bcryptはサポートしていません)。

function register($username, $password) {
    $phpass = new PasswordHash(12, false);
    $hash = $phpass->HashPassword($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $phpass = new PasswordHash(12, false);
    if ($phpass->CheckPassword($password, $hash)) {
        //ログインする
    } else {
        //失敗
    }
}