2017-02-01 16 views
1

で働いていない:これはVARCHAR(60)との列にMySQLデータベースに格納されてpassword_verify()私はそうのようなpassword_hash使用してパスワードを作成したPHP

$password = password_hash('password123', PASSWORD_DEFAULT);

。私のログインフォームで

、私が使用:

if(password_verify($password, $foundUser->Password){ /*login*/ }

$passwordは、ログインフォームから平文入力され

$foundUser->Passwordは、データベースに格納されたハッシュですが、password_verify()関数は常に戻っています偽です。

echo "Password: {$password} <br>"; echo "Found password: ".$foundUser->Password."<br>";

出力:

Password: password123 Found password: $2y$10$8.ICQHCyCPzS.xygPO4cfuHsHZb6Kuxynn8/uUHOU1.7gY.UhSIXa

はので、私は私は正しいパスワードを入力して取得しています合理的に確信しています

は、私は次のコードを使用して、私の入力をチェックして私のデータベースからの正しいハッシュ

私はthis questionのリンクを見てきましたが、回答はまだありません。 password_verify()がfalseを返す理由は誰にも分かりますか?

+1

マニュアルから:「結果を60文字以上に拡大できるデータベース列に格納することをお勧めします(255文字が良い選択です)」 –

+1

** 'PASSWORD_DEFAULT'は、新しい強力なアルゴリズムがPHPに追加されたので、時間の経過とともに変更されるように設計されています。そのため、この識別子を使用した結果の長さは時間とともに変化する可能性があります。したがって、60文字を超えて拡張できるデータベース列に結果を格納することをお勧めします(255文字は適切な選択肢です)。** - 初心者のために...データベースから得た値が、 'password_hash'によって生成されたものと同じです...? – deceze

+0

...現在のところ、 'PASSWORD_DEFAULT'はBCryptを使用していますが、必ずしも60文字の文字列でなければなりません。 – CD001

答えて

0

暗号化されたパスワード文字が100を超えている可能性があるため、データベース列の値が60以上に設定されています。$ password = password_hash( 'password123'、PASSWORD_DEFAULT);この関数は毎回変更される暗号化されたパスワードを返します。

0

password_hash()関数のphpマニュアルには注意があります:PASSWORD_BCRYPTをアルゴリズムとして使用すると、パスワードパラメータは最大72文字に切り捨てられます。 これをお読みくださいhttp://php.net/manual/en/function.password-hash.php

多分mysqlの列をvarchar(60)からvarchar(73)以上に変更する必要があります。タイプテキストも使用できます。

+0

password_hash()関数はパスワードを72文字で切り捨てますが、問題なく動作します。ハッシュはBCryptハッシュ( ''$ 2y $ 10 $ ...')の場合でも60文字です。 – martinstoeckli

0

解決済みの問題です。 @martinstoeckliと@Narfの提案によれば、私はそれをデバッグする方法を変更し、問題はpassword_verify()ではなく、出力を処理していることがわかりました。走り回って申し訳ありません、そしてあなたのすべての助けに感謝します。

関連する問題