如何将输入的密码与数据库中的哈希密码相匹配?

时间:2018-02-23 11:03:06

标签: php login php-password-hash

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

我是否还要将输入的密码哈希以与数据库中的哈希密码进行比较?或者我的查询错了?请帮忙!!!谢谢!

<?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");
        }
    }
?>

1 个答案:

答案 0 :(得分:2)

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

但是在这里:

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

您正在提取用户将散列密码与纯文本密码进行比较。所以查询永远不会返回任何行/用户。

以下是如何为 1 注册用户并 2 检查登录信息来实施非常基本系统。

首先使用prepared statements而不是对输入进行sanityzing,然后将字符串注入查询。您最终将获得更安全且更易读的代码。

1 当您在新用户存储中注册用户名和散列(以及可能 salted )密码到数据库时。

2 当您检查登录时,哈希/详细说明您输入的纯文本密码(执行注册时实施的相同流程)然后制作一个SELECT以用户名获取用户,最后检查哈希密码匹配。

假设您至少在PHP 5.5上使用password_hashpassword_verify来哈希密码(password_hash)并检查带有哈希值的明文密码({{1} }})

进一步阅读:Secure hash and salt for PHP passwords