0

私は深刻な問題を抱えています。一日中答えを探していましたが、何も見つかりません...

私がしていること:

私は自分のサイト(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 に保存して取り出した場合、変数はその値で変更されます。この場合は何もなく、パスワードが一致しません。

これを解決する方法はありますか?$または、ハッシュの記号を置き換える方法はありますか?

4

1 に答える 1

4

単一引用符文字列は処理されず、「そのまま」と見なされます。特に $variable が必要でない限り、常に一重引用符文字列を使用する必要があります。

例えば、

$var = "$2y$10$wxadWEbkn..XpJ.C1TmnaeOyneJyQbcAIJ20yBBlBoBr1XDwDkJSq";

する必要があります

$var = '$2y$10$wxadWEbkn..XpJ.C1TmnaeOyneJyQbcAIJ20yBBlBoBr1XDwDkJSq';
于 2013-09-24T18:49:51.457 に答える