当我提供正确的密码时,为什么我的密码哈希返回 false?

Why my password hash is returning false when i provide the correct password?

当我对密码进行哈希处理时,我使用了 password_hash($password, PASSWORD_ARGON2I)。

现在我想根据 sql 服务器中存储的散列密码验证我的登录密码。但是,即使我提供了正确的密码,password_verify 仍会返回 false。有人可以帮忙吗?

我尝试在 google 和 Whosebug 上搜索解决方案,但无济于事

if(isset($_POST['login'])) {

    $username = strip_tags(trim($_POST["username"]));
    $password = $_POST["password"];

    $query = "SELECT * FROM USERNAME WHERE user_id= '".$username."' ";
    $params = array();
    $stmt = sqlsrv_query($conn, $query);

    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

    $hash_password = $row['password'];

    $new = password_verify($password, $hash_password);


    if(var_dump(password_verify($password, $hash_password))){

        $msg = "Login Success"; 

    }else{

        $msg = "Login failure";

    }

    echo $msg;
}

输出returns"Login Failure"

var_dump() 总是 returns "void"。 password_verify() returns "bool"。所以你必须直接检查 password_verify()。

!警告!

您的代码已向 SQL-Injections 开放!我不建议使用您的代码。 但是,由于您特别要求一件事,这可能有效:

if(password_verify($password, $hash_password)){
    $msg = "Login Success"; 
} else {
    $msg = "Login failure";
}
  1. 乱用输入是危险的,您可能会通过使用 strip_tags 影响 userid 的内容,如果您使用准备好的查询,它无论如何都是不必要的。

  2. 在这一行 if(var_dump(password_verify($password, $hash_password))){ 中使用 var_dump() 将始终导致错误,因为 var_dump() returns NULL。

  3. sqlsrv_ 调用中添加一些错误检查也是一个好主意。

所以建议修改代码

if(isset($_POST['login'])) {

    //$username = strip_tags(trim($_POST["username"]));
    //$password = $_POST["password"];

    $query = "SELECT * FROM USERNAME WHERE user_id= ?";
    $params = array($_POST["username"]);
    $stmt = sqlsrv_prepare($conn, $query, $params);
    if( !$stmt ) {
        print_r( sqlsrv_errors(), true);
        exit;
    }

    if( sqlsrv_execute( $stmt ) === false ) {
        print_r( sqlsrv_errors(), true);
        exit;
    }

    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

    //$hash_password = $row['password'];
    //$new = password_verify($password, $hash_password);
    //if(password_verify($password, $hash_password)){

    if(password_verify($_POST["username"], $row['password']))){
        $msg = "Login Success"; 
    }else{
        $msg = "Login failure";
    }
    echo $msg;
}

Of course the other thing to check is that the hashing of the password worked correctly, ass if that failed you will never get the verify to work.

为了解决 RiggsFolly SQL 注入问题,我重做了我的代码,如下所示。希望这是正确的方法。

if(isset($_POST['login'])) {

    $username = $_POST["username"];
    $password = $_POST["password"];

    $query = "SELECT * FROM USERNAME WHERE user_id= ? ";
    $params = array($username);
    $stmt = sqlsrv_prepare($conn, $query, $params);

    if(sqlsrv_execute($stmt)){

        $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

        $hash_password = $row['password'];

        $new = password_verify($password, $hash_password);

        if(password_verify($password, $hash_password)){

            $msg = "Login Success"; 

        }else{

            $msg = "Login failure";

        }

    }

}