更新 したがって、これは恥ずかしいほど愚かな承認ですが、問題は、データベースに保存したハッシュが引用符を含む「パスワード」のハッシュであったことでした。私が書いたクエリには問題はありませんでした。問題は議長とキーボード。
これはよくある質問です。私はスタックオーバーフローとグーグルを調べて答えを見つけようとしましたが、うまくいきませんでした。
各エージェントに割り当てられたログインとパスワードを含む「エージェント」のテーブルがあります。パスワード フィールドは、長さが 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 データベースで使用すると失敗します。
何か案は?