PHP 5.5と呼ばれるpassword_hash()からの新しい関数を試しています。
私が何をしても$ hashと$ passwordは一致しません。
$password = "test";
$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";
if (password_verify($password, $hash)) {
echo "Success";
}
else {
echo "Error";
}
コードの問題は、ハッシュを処理するときに、単一引用符"
ではなく二重引用符'
を使用していることです。
割り当てるとき:
$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";
これは、phpに$2y
という変数と$10
という変数があり、最後に$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e
という変数があると考えさせています。明らかにそうではありません。
エラー報告をオンにすると、次のエラーに気づきました:
通知:未定義の変数:fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e
PHPによってスローされていました。
修正するには、すべての二重引用符を単一引用符に置き換えます。
例えば
$hash = '$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e';
ハッシュ全体を、変数が埋め込まれた文字列ではなく、リテラル文字列として扱います。
Password_verify()でも同様の問題がありました。私の場合の誤りは、データベースのパスワードフィールドをvarchar(30)と宣言したことですが、ハッシュは60文字以上です。
私にとってはうまくいきます。
<?php
$hash=password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>
出力:
パスワードは有効です!