【问题标题】:How to match a inputted password to hashed password from database?如何将输入的密码与数据库中的哈希密码匹配?
【发布时间】:2018-02-23 11:03:05
【问题描述】:

由于某些原因,我不知道我是否真的从数据库中获取了散列密码,或者我是否正在将它与输入的密码进行比较。我已经使用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");
        }
    }
?>

【问题讨论】:

    标签: php login php-password-hash


    【解决方案1】:

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

    但在这里:

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

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


    以下是您应该如何着手实施非常基本的系统,用于1注册用户和2检查登录。

    首先使用prepared statements,而不是清理输入,然后将字符串注入查询。您最终会得到更安全和更易读的代码。

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

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


    假设您至少在 PHP 5.5 上使用 password_hashpassword_verify 对密码 (password_hash) 进行哈希处理,并使用哈希密码 (password_verify) 检查明文密码

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

    【讨论】:

    • 这非常有用,我必须感谢你。但不幸的是,它仍然没有登录。我已经尝试对用户输入的密码进行哈希处理,并按照您的建议进行了一次查询。 $hashedPasswordInput = password_hash($password, PASSWORD_DEFAULT);$query = mysqli_query ($conn, "SELECT * FROM admin WHERE username='$username' AND password='$hashedPasswordInput'") OR DIE(mysqli_error($conn));
    • 我无法使用提供的信息和显示的代码来修复您的代码(通常这是您的工作,因此通常您会得到帮助)。尝试缩小/隔离损坏的代码部分。 失败的测试是什么? if (password_verify($password, $hashedPasswordFromDb)) ?最后,向我们展示您在注册时用来散列密码的代码。也许我或其他人可以提供进一步的帮助。
    • 我让它工作了!这句话:制作一个 SELECT 以通过用户名获取用户让它工作!我没有注意到这一点。谢谢,真的!
    猜你喜欢
    • 1970-01-01
    • 2014-09-27
    • 2014-08-18
    • 2017-08-05
    • 1970-01-01
    • 2016-03-06
    • 2012-07-11
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多