使用password_verify和password_hash

时间:2019-05-31 22:17:33

标签: php mysql

我正在将用户添加到我的数据库中,并尝试使用password_hash和他们提交的密码。添加后,用户需要能够登录。我正在尝试使用verify_password验证密码,但该密码始终返回false。

我已经能够使用password_hash添加用户,但是无法使用password_verify方法登录添加的用户。奇怪的是,如果我在phpmyadmin中添加了一个MD5用户,则可以使用md5($ password)毫无问题地将他们登录。如果我通过代码将用户添加为md5,即使密码匹配,也无法使用此方法登录。

我一直在搜索,似乎无法弄清楚我在做什么。

这是为了测试我是否可以登录用户。我知道MD5不是一个好方法。如果我手动添加用户并在phpmyadmin中使用MD5方法,则此代码有效:

if(md5($password) === $hashed) {
  // log in user code
}

添加密码时,我将其加密为:

$password = md5($_POST['password']);

然后将其添加到数组中并将其插入数据库中。再次,这只是一个测试。

当我尝试使用password_hash函数(这是我想做的)时,password_verify无法正常工作。这就是我想要做的。

插入功能:

function insertAgent($conn) {
    $firstname = testdata($_POST['firstname']);
    $middlename = testdata($_POST['middlename']);
    $lastname = testdata($_POST['lastname']);
    $phone = testdata($_POST['phone']);
    $email = testdata($_POST['email']);
    $position = testdata($_POST['position']);
    $agency = testdata($_POST['agency']);
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);

    $agentArray[] = array(
            'AgentId' => '',
            'AgtFirstName' => $firstname,
            'AgtMiddleInitial' => $middlename,
            'AgtLastName' => $lastname,
            'AgtBusPhone' => $phone,
            'AgtEmail' => $email,
            'AgtPosition' => $position,
            'AgencyId' => $agency,
            'password' => $password
        );

    foreach ($agentArray as $array) {
        $query = "INSERT INTO agents";
        $result = $conn->query($query);
        $query .= " (`".implode("`, `", array_keys($agentArray[0]))."`) VALUES";

        foreach ($agentArray as $array) {
            $query .= " ('".implode("', '", $array)."'),";
        }

        $query = substr($query,0,-1); // remove last comma

        $result = mysqli_query($conn, $query) or die(mysql_error());

登录:

if(!empty($_POST["login"])) {

            $useremail = trim($_POST['useremail']);
            $password = trim($_POST['password']);

            $pass_query = mysqli_query($conn, "SELECT password FROM agents WHERE AgtEmail='$useremail'");
            $pass = mysqli_fetch_assoc($pass_query);
            $hashed = $pass['password']; 

            if(password_verify($password, $hashed)) {
                $result = mysqli_query($conn, "SELECT * FROM agents WHERE AgtEmail='" . $useremail . "'");
                $row  = mysqli_fetch_assoc($result);

                if(is_array($row)) {
                    $_SESSION["AgentId"] = $row['AgentId'];
                }
            } else {
                $message = "<p class='errorForm'>Invalid Email or Password</p>";            
                }
            }

数据库中的散列版本($散列)与用户的md5版本匹配,但除非我手动添加,否则它将导致错误。

0 个答案:

没有答案