私は深刻な問題を抱えています。一日中答えを探していましたが、何も見つかりません...
私がしていること:
私は自分のサイト(PHPで)にユーザーをログインさせようとしています。
パスワードとユーザーは、サーバーの MySQL データベースに保存されます。
パスワードにはBcryptを使用しています。唯一の問題は、私がBcryptコードを変更する知識がないことです.無料のサイトからクラスを取得しました。
問題
問題は、パスワードをハッシュしているときに$
、前に 3 つの記号が表示されることです。
例:loltest
になります$2y$10$wxadWEbkn..XpJ.C1TmnaeOyneJyQbcAIJ20yBBlBoBr1XDwDkJSq
ハッシュ化されたパスワードは、データベースのテーブルに保存されます。
ステップ1
ユーザーがパスワードを入力してログインすると、php コードはパスワードがハッシュ化されたパスワードと一致するかどうかを検証します。ユーザーの名前は$phpro_username
で、パスワードは に保存され$phpro_password
ます。
しかし、その関数を呼び出す前に、次のようにテーブルからハッシュ化されたパスワードを選択しています。
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT phpro_password FROM phpro_users WHERE phpro_username = '$phpro_username'");
$stmt->execute();
$hash = $stmt->fetchColumn();
ステップ2
という関数を使用しようとしましたがpassword_verify
、次のようになります。
function password_verify($password, $hash) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
return false;
}
$ret = crypt($password, $hash);
if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) {
return false;
}
$status = 0;
for ($i = 0; $i < strlen($ret); $i++) {
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
}
return $status === 0;
}
どうすればいいのですか?
$check = password_verify($phpro_password, $hash);
パスワードが一致$check
する場合は 1 になり、一致しない場合は空になります。
通常、これは機能するはずですが、このコードを実行しているとき$check
は常に空です。MySQL なしでこれを実行しようとしても、問題はありません。
<?php
include 'password.php';
$password = "loltest";
$hash = password_hash($password, PASSWORD_BCRYPT);
$verify = password_verify("loltest", $hash);
echo $verify;
?>
たとえば、上記のコードを実行すると、$verify
常に 1 になります。
いくつかの調査の後:
問題は MySQL にあると思います。私のハッシュには 3 つの$
記号があるため、これを MySQL に保存して取り出した場合、変数はその値で変更されます。この場合は何もなく、パスワードが一致しません。
これを解決する方法はありますか?$
または、ハッシュの記号を置き換える方法はありますか?