php

时间:2015-11-27 17:26:27

标签: php security hash password-encryption

我想用用户插入的输入来验证我存储的散列密码。

什么理论说......

在阅读了password_hash和password_verify的机制之后,我意识到理论上,插入的字符串将与哈希进行比较,至少在我的情况下,哈希存储在站点db中。

发生了什么......

我使用password_hash注册我的用户,然后验证登录我使用password_verify。如果我很好并且代码是正确的,那么这个函数应该用存储的哈希来验证用户的输入(即使它是纯文本(?))。

让我们看看代码:

注册码:

$passwordHash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 12));

注意:代码更多,但我想这是最重要的部分,所以我决定只粘贴这部分。

登录代码:

<?php
//controller! 
    require "../model/backend.php";

    $username = $_POST['user'];
    $password = $_POST['password'];

    $dbcom = new dbInteraction;
    $dbcom->admlog($username, $password);
    $dbcom->conclose();

?>

验证码:

$this->username = $username;
        $this->password = $password;
        //$this->pdo = $pdo;
        //$adm = 1;

        $myquery = 'SELECT username, password, isadmin FROM users WHERE username = :username';// AND password = :password'; 

        $stmt = $this->pdo->prepare($myquery);
        $stmt->bindParam(':username', $username, PDO::PARAM_STR);

        $stmt->execute();
        $user = $stmt->fetch(PDO::FETCH_ASSOC);


        if($user === false){

            die('1Incorrect username / password combination!');
        } else{


        //Compare the passwords.
            $dbpass =  $user['password'];
            echo $dbpass;
            echo '<br>bd<br>input<br>';
            echo $password;
            $validPassword = password_verify($dbpass, $password);
            echo '<br>debug <br>';
            echo 'pre pass:<br>';
            echo $validPassword;

            if($validPassword){

                //Provide the user with a login session.
                $_SESSION['user_id'] = $user['username'];
                $_SESSION['logged_in'] = time();


                //header('Location: home.php');
                exit;
            }else{

                die('<br>no pass--Incorrect username / password combination!');
            }
    }

我的代码中是否存在一些理论基础问题,或者它的编码错误?我还在努力实现。

非常感谢。

1 个答案:

答案 0 :(得分:1)

问题是按password_verify params的顺序。

应该像$validPassword = password_verify($password, $dbpass); 或者用通用的词语:  $validPassword = password_verify('String to verify', 'Saved password');

特别感谢@JonStirling