使用散列密码登录 PHP

t_s*_*ist 4 php mysql hash

正如标题所暗示的那样,在对注册表单中的密码进行哈希处理后,我无法登录用户。我使用了 PHP 内置的 password_hash() 和 password_verify() 函数,但它在 signin.php 上使用了 password_verify(),我遇到了麻烦。我知道 password_verify() 的参数是一个哈希值,但是如何使用在 signup.php 中生成和存储的相同哈希值才能在此函数中使用?

注意:是的,这两套代码还有更多内容!数据库连接有效,所有未在这些位中定义的变量都定义了一些行。signup.php 工作完美,表单数据,包括散列密码成功存储在我的数据库中。

这是 signup.php 中实现哈希的部分:

    $hash = password_hash($password, PASSWORD_DEFAULT);
    $sql = "INSERT INTO users (id, full_name, email, password, username, sign_up_date, activated) VALUES ('', '$full_name', '$email', '$hash', '$username', '$date', '1')";
Run Code Online (Sandbox Code Playgroud)

这是 signin.php 的一部分,其中需要(大概相同)哈希: $password = mysqli_real_escape_string($_POST['password']);

if (!password_verify($password, $hash)) {
    echo 'Invalid password.';
    exit;
}

$sql = "SELECT id, email, password FROM users WHERE email = '$email' AND password = '$password' AND activated = '1' LIMIT 1";
$query = mysqli_query($conn, $sql);
Run Code Online (Sandbox Code Playgroud)

编辑:一天后我自己发现了这一点,不得不使用“SELECT * FROM ...”从数据库中检索存储的哈希值,然后将其与使用 password_verify() 输入的密码进行比较。不过还是谢谢你的帮助!

pue*_*elo 6

我很清楚问题出在哪里。您声明您已经将散列密码(带有password_hash())存储在您的数据库中。所以基本的工作流程是:

a) 将注册时给出的密码的哈希值保存在您的数据库中(不是明文密码):

$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);    
$sql = "INSERT INTO users (id, full_name, email, password, username, sign_up_date, activated) VALUES ('', '$full_name', '$email', '$hash', '$username', '$date', '1')";
Run Code Online (Sandbox Code Playgroud)

b) 如果用户尝试登录,您只需从数据库中获取哈希值WHERE email = '{$_POST['email']},然后使用该password_verify函数:

if (!password_verify($_POST['login_password'], $hash_from_database)) { exit; }
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?


Man*_*nam 2

我对你的问题很困惑,但我相信你想将注册用户的密码转换为哈希然后验证它?为什么还要验证密码?

但如果我的理解正确的话,你可以通过这种方式实现它:

$hash = password_hash($password, PASSWORD_DEFAULT);

if (!password_verify($password, $hash)) {
    echo 'Invalid password.';
    exit;
}
Run Code Online (Sandbox Code Playgroud)

密码将是您从用户那里获得的密码,您将其转换为哈希值然后验证它,但它对我来说仍然没有意义,为什么您要这样做?