3

更新 したがって、これは恥ずかしいほど愚かな承認ですが、問題は、データベースに保存したハッシュが引用符を含む「パスワード」のハッシュであったことでした。私が書いたクエリには問題はありませんでした。問題は議長とキーボード。

これはよくある質問です。私はスタックオーバーフローとグーグルを調べて答えを見つけようとしましたが、うまくいきませんでした。

各エージェントに割り当てられたログインとパスワードを含む「エージェント」のテーブルがあります。パスワード フィールドは、長さが 255 の varchar です。

これが私のphpコードです:

     $conn = new mysqli( "localhost", "VABEN", "**********", "VABen" );
     if( $conn->connect_error )
     {
        die( "Connection failed!" . $conn->connect_error );
     }
     $username = $_POST["username"];
     $password = $_POST["password"];

     $s = $conn->prepare( "SELECT `agent_password` FROM `VABen`.`agents` WHERE `agent_login`=?" );
     $s->bind_param( "s", $username );
     $s->execute();

     $hash = $s->get_result();
     $hash = $hash->fetch_array( MYSQLI_ASSOC );

     $testpw = password_hash( 'password', PASSWORD_DEFAULT );
     echo "Comparing submitted password to locally created hash $testpw which has a length of " . strlen($testpw) . "<br>";
     if( password_verify( $password, $testpw ) )
     {
        echo "Password '$password' matches with hash $testpw<br>";
     }
     else
     {
        echo "Password '$password' does not match with hash $testpw<br>";
     }
     echo "<br>";

     echo "Supplied Password: '$password'<br>";
     echo "Queried Hash: " . $hash['agent_password'] . " which has a length of " . strlen( $hash['agent_password'] ) . "<br>";
     echo "Result of password_verify: ";
     if( password_verify( $password, $hash['agent_password'] ) )
        echo "true<br>";
     else
        echo "false<br>";

私は途方に暮れています。ローカルに作成された password_hash のコピーを提供した場合にのみ機能するように見えますが、そのローカルに作成されたコピーを MySQL データベースで使用すると失敗します。

何か案は?

4

1 に答える 1

1

ハッシュを保存する

agent_password以下によって生成されたハッシュが保存されていることを確認しましたか?

password_hash( $password, PASSWORD_DEFAULT );

PDO 規格を確認する

おそらく効果はありませんが、 のさまざまな実装の標準に従う価値がありbindParamます。?メソッドを使用している場合は、次のようになります。

 $s->bind_param( 1, $username );

スクリプトに PDO の奇妙な実装がいくつかあります。調整してみてください。

 $s->execute();

 //$hash = $s->get_result();
 //$hash = $hash->fetch_array( MYSQLI_ASSOC );
 $hash = $s->fetchColumn();

代わりにの後続の呼び出しを変更$hash['agent_password']してください。$hash

基本操作のテスト

以下をテストします。

// $password = $_POST["password"];
$password = "password";

次に、最後の検証ステップの前に、そのハッシュを保存し、mysql から再度取得してみてください。

ついに

agent_passwordに保存されているのは、実際には でハッシュされたパスワードではないのではないかと深く疑っていますpassword_hash

于 2014-11-20T23:48:40.890 に答える