我可以看到这个问题已经问了很多次了,并且给出了答案,但是您的新帮助将不胜感激。 我一直在尝试使用password_hash()将密码提交到数据库之前对密码进行哈希处理。可以,但是password_verify()不起作用。香港专业教育学院试图编辑的方式超出了我的想象,仍然无法正常工作。同时,我之前一直在使用sha512方法,但我注意到该特定页面的所有密码生成的字符串都是相同的-数据库中的其他页面及其各自的表均不受影响。 这是password_hash文件:
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
include('config.php');
$conn = mysqli_connect(DB_DSN,DB_USERNAME,DB_PASSWORD,'kqusers');
$name = test_input($_POST['name']);
$pName = test_input($_POST['pName']);
$month = $_POST['month'];
$day = $_POST['day'];
$year = $_POST['year'];
$date = $month." ".$day." ".$year;
$class = $_POST['level'];
$username = test_input($_POST['username']);
$password = test_input($_POST['pass']);
$enc_password = password_hash($password, PASSWORD_DEFAULT);
$insert = mysqli_query($conn,"INSERT INTO student_user (name, parent_name, dob, class, username, password) VALUES ('$name', '$pName', '$date', '$class', '$username', '$enc_password')");
if ($insert) {
echo "inserted";
}
else{
echo "error";
}
mysqli_close($conn);
现在,密码验证文件:
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
include('config.php');
$conn = mysqli_connect(DB_DSN,DB_USERNAME,DB_PASSWORD,'kqusers');
$username = test_input($_POST['username']);
$password = test_input($_POST['password']);
$user_qry = mysqli_query($conn,"SELECT username FROM student_user WHERE username= '".$username."'");
$user=mysqli_fetch_assoc($user_qry);
$num_users = mysqli_num_rows($user_qry);
if ($num_users == 0) {
echo "user_error";
}
else{
$pass_qry = mysqli_query($conn,"SELECT password FROM student_user WHERE username= '".$username."'");
$pass = mysqli_fetch_assoc($pass_qry);
$enc_password = $pass["password"];
$verify = password_verify($password, $enc_password);
if ($verify) {
echo "login";
}
else{
echo "error";
}
}
mysqli_close($conn);
密码字段是varchar(255),我想我已经采取了所有已知的预防措施。我试过运行几行代码,以查看错误之处。在此文件中,我使用字符串'jim'初始化了一个变量,对其进行了哈希处理,然后对其进行了验证。但是,当我在对哈希进行哈希处理后将相同的“ jim”作为密码插入数据库并尝试对其进行验证时,它将返回false。这就是我的意思:
$pass = "jim";
$enc_pass = password_hash($pass,PASSWORD_DEFAULT);
$ver = password_verify($pass,$enc_pass);
if($ver){
echo "yes";
}
else{
echo "no";
}
上面的代码显示“是”。但是,当我通过非响应页面将散列的'jim'插入数据库并尝试针对散列字符串进行验证时,如下所示:
$pass = "jim";
$enc_pass = password_hash($pass,PASSWORD_DEFAULT);
$ver = password_verify($pass,'$2y$10$puPHBPrgSM2gPoECXH43vev6c9PCSDoOpdGwEryL/WsZTqR8ofZ8a');
if($ver){
echo "yes";
}
else{
echo "no";
}
返回“否”。
答案 0 :(得分:2)
散列时,实际上是在散列一个空字符串,而不是密码。以下代码针对您提供的哈希返回true
:
password_verify('','$2y$10$puPHBPrgSM2gPoECXH43vev6c9PCSDoOpdGwEryL/WsZTqR8ofZ8a');
这意味着您的密码哈希文件中的$password
变量实际上为空。这也可以解释为什么sha512
哈希的输出对于每个密码都是相同的,这显然是永远不会发生的。用相同的sha512
散列找到2个不同的字符串的机会实际上为零。
我的猜测是,由于您在验证脚本中使用了$_POST['pass']
和$_POST['password']
,因此您感到困惑,但这只是一个猜测。
另一方面,您需要停止将变量直接放入SQL查询中,因为这会使您的脚本容易受到SQL注入攻击。而是使用带有绑定参数的预备语句。