php password_verify()hash和pass赢了匹配

时间:2015-12-25 02:00:13

标签: php mysql mysqli truncate

我将密码存储在我的数据库中,并使用password_hash()进行哈希处理,我正在尝试使用password_verify()验证登录时的密码。由于某种原因,password_verify()一直返回false。

我阅读了关于这个函数的文档,它说要确保函数中使用的哈希是在单引号和#39;之间。 '否则它会读取哈希值,因为它是三个变量因为$,所以我尝试写这样的有效,因为这有效' $ valid'。但这没有用。

当我回显$ valid时,输出为$ 2y $ 10 $ zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT

当我回显$ check时,输出为123,这是用于创建帐户的密码。

这是我的login.php的一部分,这是我觉得问题所在。

$emailLogin = mysqli_real_escape_string($con, $_POST['emailLogin']);

$passLogin = mysqli_real_escape_string($con, $_POST['passLogin']);

$query = "SELECT `pass` FROM `user` WHERE `email`='$emailLogin'";

$result = mysqli_query($con, $query);

$row = mysqli_fetch_array($result);

$pass = $row['pass']; 

$key = VUP($passLogin, $pass);

这是我的verify.php的一部分

function VUP($check, $valid){

if (password_verify($check, $valid)) {
$key = 1;

} else {
echo 'Invalid password.';
$key = 0;
die();
}
return $key;

}

也是verify.php的一部分

function SHP($password){

$hash = password_hash('$password', PASSWORD_BCRYPT);

return $hash;

}

任何建议都会非常有用。

1 个答案:

答案 0 :(得分:3)

  

“当我回显$有效时,输出为$ 2y $ 10 $ zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT”

$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT哈希的长度只有50,并且无效/太短,正如我所说,MySQL将无声地失败;错误报告/检查在这里没有帮助。

密码的列长度应为60(建议为255),因此最初未正确存储。

您需要清除密码栏/表格,增加列长,然后重新开始。

参考:

  

“因此,建议将结果存储在可扩展到60个字符以上的数据库列中(255个字符将是一个不错的选择)。”

您还可以将查询修改为:

$con = new mysqli("xxx", "xxx", "xxx", "xxx");
if ($con->connect_error) {
    die('Connect Error (' . $con->connect_errno . ') '
            . $con->connect_error);
}

$query = "SELECT `pass` FROM `user` WHERE `email`='$emailLogin'";
$result = $con->query($query);

// error checking on the query
if (!$result) {
    echo "<p>There was an error in query: $query</p>";
    echo $con->error;
}

$row_hash = $result->fetch_array();
if (password_verify($passLogin, $row_hash['pass'])) {
    echo "Success!";
}

编辑:

从评论中添加我留给OP:

您的验证功能需要与您的数据库建立连接,这就是我在这里发生的事情(变量范围)。因此,您需要使用global $con;或将连接(变量)传递给您的函数(在大多数情况下更好)。

我不知道你是否正在为该功能做一个“包含”,如果是,那么那就是另一个问题。

即:function VUP($con, $check, $valid){function VUP($check, $valid){ global $con; - 尝试两者。使用$result = mysqli_query($con, $query) or die(mysqli_error($con));代替您现在拥有的那个。