password_verify - 密码散列

password_verify - password hashing

我正在测试不同的加密密码的方法,我已经使用了大多数方法,除了我对我正在使用的脚本的 password_verify 函数以及如何在脚本中实现它感到困惑(看以下)。此脚本涉及注册和登录等。脚本成功地使用下面这行代码对密码进行哈希处理。

$passwordhash = password_hash($p, PASSWORD_DEFAULT);

(来自注册)

但是当我尝试在我的登录脚本中使用密码验证时它不起作用。所以我的问题是如何在下面的代码中使用 password_verify 函数。

<?php
//this is executed on another page
if(isset($_POST["e"])){
    // Connect to db
    include_once("databaseconnection.php");
    //gather posted and sanitize
    $e = mysqli_real_escape_string($db_conx, $_POST['e']);
    $p = ($_POST['p']);
    //user ip
    $ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
    // FORM DATA ERROR HANDLING
    if($e == "" || $p == ""){
        echo "login_failed";
        exit();
    } else {
    //data error handling end
        $sql = "SELECT id, username, password FROM users WHERE email='$e' AND activated='1' LIMIT 1";
        $query = mysqli_query($db_conx, $sql);
        $row = mysqli_fetch_row($query);
        $db_id = $row[0];
        $db_username = $row[1];
        $db_pass_str = $row[2];
        if($p != $db_pass_str){
            echo "login_failed";
            exit();
        } else {
            //create session cookies
            $_SESSION['userid'] = $db_id;
            $_SESSION['username'] = $db_username;
            $_SESSION['password'] = $db_pass_str;
            setcookie("id", $db_id, strtotime( '+30 days' ), "/", "", "", TRUE);
            setcookie("user", $db_username, strtotime( '+30 days' ), "/", "", "", TRUE);
            setcookie("pass", $db_pass_str, strtotime( '+30 days' ), "/", "", "", TRUE); 
            //update certain fields ip, last login time
            $sql = "UPDATE users SET ip='$ip', lastlogin=now() WHERE username='$db_username' LIMIT 1";
            $query = mysqli_query($db_conx, $sql);
            echo $db_username;
            exit();
        }
    }
    exit();
}
?>

(我使用 password_verify 函数尝试过,但失败了)

$p = password_verify( $_POST['p'], $passwordhash );

抱歉,如果这很难理解,但如果有人能提供帮助,我们将不胜感激:-)

假设您存储在数据库中的密码已经经过哈希处理,您遇到的问题是您无法验证密码,因为您正在将纯文本密码与哈希代码进行比较。

我相信改变

if($p != $db_pass_str){
        echo "login_failed";
        exit();
    } 

if(!password_verify($p, $db_pass_str)) {
       echo "login_failed";
        exit();
}

应该可以解决您的问题,请查看 password_hash and the password_verify

你有这个:

$p = ($_POST['p']);

但在此之前没有做任何更改 $p:

if($p != $db_pass_str){

考虑到什么是典型的,在客户端进行散列是非典型的,数据库以纯文本形式存储密码也是非典型的,所以我最好的猜测是表单正在传递一个未散列的密码和数据库正在存储散列密码。除非您在登录表单中输入密码哈希,否则会导致第二行失败。

如果这不是问题,那么也许 post 一些额外的上下文。