我将密码存储在我的数据库中,并使用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;
}
任何建议都会非常有用。
答案 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));
代替您现在拥有的那个。