0

ircmaxellが書いたpassword_compatというスクリプトを使用しています。彼の指示には正しく従ったと思いますが、 を使用してパスワードを確認できないようですpassword_verify($password, $hash)

データベースに保存されているハッシュ化されたパスワードは次のとおりです。

$2y$10$zYpSzIj7kTPv3H7wDI/uXSYqi1se46b38uumP6SM4XGMmsjU3q

私は PDO を使用してハッシュ化されたパスワードを取得しpassword_verify($password, $hash)、ログインフォームが投稿しているものを比較するために使用しています。BRCYPT はハッシュ関数ではないため、password_verify($password, $hash)魔法のように機能することは私の理解です。ソルトがどのように作成されるかはわかりませんが、新しいパスワードごとにカスタムソルトが作成されると思いますが、それを保存したパスワードと比較する方法がわかりません。正しいソルトとパスワードをどのように一致させますか? この全体がデータベースに塩を保存していないことは、私を混乱させます、笑。これが私が使用しているコードです。

bcrypt

if($login->verifyip($_SERVER['REMOTE_ADDR']))
{
    require_once 'password.php'; //password_compat supplied file

    $username   = $_POST['username'];
    $password   = $_POST['password'];
    $dbpassword = $login->GetPassword($username); // pull saved password from db

    // verify posted password with saved password
    if(password_verify($dbpassword, $password))
    {
        echo 'verified';
    }
    else
    {
        echo 'not verified';
    }
}

PDO

public function GetPassword($username)
{
    $passwordSQL = 'CALL get_password(:_user)'; // using stored procedure
    try
    {
        $pdo = new PDO('my login stuff');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $password = $pdo->prepare($passwordSQL);
        $password->bindParam(':_user',$username);
        $password->execute();
        $fetch = $password->fetchColumn(0);
        $password->closeCursor();
        return $fetch;
    }
    catch(PDOException $e)
    {
         return 'error' . $e->getMessage();
         exit();
    }        
}

ブレンダーが提案したように $hash を削除しました。

ご覧いただきありがとうございます:)

4

1 に答える 1

2

password_verifyの引数は逆です。

password_verify($password, $dbpassword)

それがどのように機能するかについては、ハッシュは次の形式です。

$<algorithm>$<cost>$<salt>/<hash>

したがって、ハッシュから:

$2y$10$zYpSzIj7kTPv3H7wDI/uXSYqi1se46b38uumP6SM4XGMmsjU3q

10コストが、ソルトがzYpSzIj7kTPv3H7wDI、それbcrypt(salt + password)がであることがわかりますuXSYqi1se46b38uumP6SM4XGMmsjU3q

password_verify提供されたハッシュからその情報を抽出し、bcrypt(salt + password) == hash.

于 2013-04-26T22:25:33.720 に答える