【问题标题】:How to password_verify() with hash from database如何使用来自数据库的哈希进行密码验证()
【发布时间】:2015-09-15 11:01:36
【问题描述】:

尝试从数据库验证哈希密码,用户通过 POST 输入。经过一些简短的研究,似乎这个问题可能与无法将 mysqli_query 转换为字符串有关,尽管我不知道如何正确地做到这一点,因此我从另一个 SO 问题中添加了 fetch_object() 等。我还充分考虑了设置为 varchar(255) 的列的长度。感谢任何帮助或指导,谢谢。

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$password = $_POST['password'];
$db_password = mysqli_query($conn, 'SELECT password FROM sec')->fetch_object()->password;

if (password_verify($password, $db_password)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

【问题讨论】:

  • @martinstoeckli 哦,天哪,你是对的,我在想别的东西。对不起,我会删除 cmets,以免混淆 OP。
  • 假设每个用户都有自己的密码,那么您的 SQL 语句似乎是错误的:SELECT password FROM sec 这会从表 sec 中搜索所有密码。相反,您可能想要搜索给定的用户,如下所示:SELECT password FROM sec WHERE username = ?
  • 无论如何,尽管如此,如果你能转储你的$db_password,那还是很好的。如果该查询甚至可以正常工作,您可能会收到结果数组/obj,而不是单个字符串。
  • @masteryupa - 那么你做了var_dump($db_password)var_dump($password) 吗?它们是否具有正确的数据类型和正确的长度并且没有任何空格?
  • @masteryupa - 我会看看存储过程,也许那里添加了空白?最好不要在数据库中。

标签: php mysql passwords


【解决方案1】:

首先从数据库中获取密码hash,然后将用户输入的密码转换成hash值。通过password_verify()函数比较这两个值,就可以得到正确的结果。

【讨论】:

    【解决方案2】:
        $password = "test";
    
        $hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";
    
    
    
        if (password_verify($password, $hash)) {
            echo "Success";
        }
        else {
            echo "Error";
        }
    
    OR
    You can use this one too
    $verify=password_verify($_POST['passwrd'],$row[2]);
    
    if($verify){
        $_SESSION["usrname"]=$usrname;
        echo "Correct";
    }
    else {
        echo "user: " . $usrname. "<br>";
        echo "pass: " . $hash. "<br>";
        echo "db: " . $row[2]."<br>";
        echo "Wrong Username or Password";
    }
    

    【讨论】:

    • 我认为password_verify()函数不是问题,它被OP正确使用了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2019-04-28
    • 2017-06-05
    • 2016-06-06
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多