Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 密码验证-密码哈希_Php_Passwords - Fatal编程技术网

Php 密码验证-密码哈希

Php 密码验证-密码哈希,php,passwords,Php,Passwords,我正在测试加密密码的不同方法,我使用了大多数方法,除了我对我正在使用的脚本的密码验证函数以及如何在脚本中实现它感到困惑(请参见下文)。此脚本包括注册和登录等。该脚本使用下面这行代码成功地散列密码 $passwordhash = password_hash($p, PASSWORD_DEFAULT); <?php //this is executed on another page if(isset($_POST["e"])){ // Connect to db inclu

我正在测试加密密码的不同方法,我使用了大多数方法,除了我对我正在使用的脚本的密码验证函数以及如何在脚本中实现它感到困惑(请参见下文)。此脚本包括注册和登录等。该脚本使用下面这行代码成功地散列密码

$passwordhash = password_hash($p, PASSWORD_DEFAULT);
<?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函数

$passwordhash = password_hash($p, PASSWORD_DEFAULT);
<?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();
}
?>

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

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

我相信改变

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

如果要解决您的问题,请查看,您有以下几点:

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

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

如果($p!=$db\u pass\u str){

考虑到典型的情况,在客户端进行散列是不典型的,而数据库以明文形式存储密码是不典型的,因此我最好的猜测是表单正在传递一个未加密的密码,而数据库正在存储一个散列的密码。这会导致第二个引号中的行失败,除非您输入密码散列在登录表单中


如果这不是问题,那么可能会发布一些额外的上下文。

password\u verify函数将返回一个布尔值。您需要使用If条件检查语句是否为true。您的代码容易受到攻击。始终使用参数,而不是
mysqli\u real\u escape\u string
,因为从长远来看,您会发现它更容易使用。在我的数据库已成功哈希。使用上面的代码,我应该更改行$p=($\u POST['p']),还是保持不变?谢谢您的帮助。保持不变,$p=$\u POST['p']只需将通过浏览器发送的密码分配给一个变量。因此,您需要相同的密码,然后使用password verify进行内部检查,查看纯文本密码的哈希值是否与提供的哈希值匹配。我明白您的意思。使用md5和sha1稍微容易一些(但不太安全)。我通常只需将md5添加到其中,如$p=md5($_POST['p']);但是使用password\u verify很难以这种方式翻译它,因为我不能像md5那样将password\u verify放在它前面。$p=password\u verify($_POST['p'])不起作用。