web-dev-qa-db-ja.com

php password_hashとpassword_verifyが一致しない

PHP 5.5と呼ばれるpassword_hash()からの新しい関数を試しています。

私が何をしても$ hashと$ passwordは一致しません。

$password = "test";

$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";



if (password_verify($password, $hash)) {
    echo "Success";
}
else {
    echo "Error";
}
10
Daniel

コードの問題は、ハッシュを処理するときに、単一引用符"ではなく二重引用符'を使用していることです。

割り当てるとき:

$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";

これは、phpに$2yという変数と$10という変数があり、最後に$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4eという変数があると考えさせています。明らかにそうではありません。

エラー報告をオンにすると、次のエラーに気づきました:

通知:未定義の変数:fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e

PHPによってスローされていました。

修正するには、すべての二重引用符を単一引用符に置き換えます。

例えば

$hash = '$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e';

ハッシュ全体を、変数が埋め込まれた文字列ではなく、リテラル文字列として扱います。

41
initramfs

Password_verify()でも同様の問題がありました。私の場合の誤りは、データベースのパスワードフィールドをvarchar(30)と宣言したことですが、ハッシュは60文字以上です。

7

私にとってはうまくいきます。

<?php

$hash=password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

出力:

パスワードは有効です!

4