如何将输入的密码与数据库中的Hashed密码匹配



出于某些原因,我不知道我是否真的从数据库中获取了哈希密码,还是我将其正确比较到输入的密码。我已经成功地使用了password_hash方法测试了我的注册,并且在数据库中看到了Hashed密码。

我还应该将输入的密码与数据库中的Hashed密码进行比较?还是我的查询完全错误?请帮忙!!!谢谢!

<?php
require "../connection.php";
session_start();
    if(isset($_POST['login'])) {
    $username = stripslashes($_POST['username']);
    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = stripslashes($_POST['password']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);
    $query = mysqli_query ($conn, "SELECT * FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));
    $reader = mysqli_num_rows($query);
        if ($reader == 1) {
            $passwordQuery = mysqli_query ($conn, "SELECT password FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));
            $row = mysqli_fetch_array($passwordQuery);
            $hashedPasswordFromDb = $row['password'];
            if (password_verify($password, $hashedPasswordFromDb)) {
                $query = mysqli_query ($conn, "SELECT id, student_number FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));
                $row = mysqli_fetch_array($query);
                $id = $row['id'];
                $student_number = $row['student_number'];
                $sesData = array('id' => $id, 'student_number', $student_number);
                $_SESSION['ses_account'] = $sesData;
                mysqli_query ($conn, "UPDATE admin SET lastLogin=NOW() WHERE student_number='$student_number'");
                header("location: dashboard.php");
            } else {
                $msg="User not recognized. Please try again.";
                urlencode($msg);
                header("location: ../index.php?errmsg=$msg");
            }
        } else {
            $msg="User not recognized. Please try again.";
            urlencode($msg);
            header("location: ../index.php?errmsg=$msg");
        }
    }
?>

我假设您正在将密码存储到数据库中(很好(

但在这里:

$query = mysqli_query ($conn, "SELECT * FROM admin WHERE username='$username' AND password='$password'") OR DIE(mysqli_error($conn));

您正在获取用户将Hashed密码与普通文本进行比较的用户。因此查询永远不会返回任何行/用户。


这是您应该如何实现的非常基本的系统 1 注册用户和 2 检查登录。

首先使用准备的语句而不是Sanityzing输入,然后将字符串注入查询中。您最终会以更安全和更可读的代码。

1 在注册新用户商店时,用户名和哈希(以及可能 Salted (密码到DB。

2 检查登录时,哈希/详细说明您获得的纯文本密码(使用相同的过程您在执行注册时实现(,然后进行单个单个SELECT通过用户名获取用户,并最终检查Hashed密码匹配。


假设您至少在PHP 5.5上使用 password_hash password_verify 用于哈希密码(password_hash(,并使用Hashed One(password_verify(

在此处进一步阅读:安全哈希和盐的PHP密码

最新更新