使用返回 0 的查询行比较 mysql 密码哈希值(不工作)
Comparing mysql password hashes using query row returning 0 (not working)
我正在使用 mysql 数据库为我的网站创建登录系统。
当用户注册时,它使用以下方式将密码保存到数据库中:
$password = hash("sha512","somesalt".$password."moresalt");
然后当我登录时,我使用相同的哈希函数将输入的密码与数据库中的密码进行比较。
为了比较我使用的数据库:
$query = mysql_query("select * from users where password='$password' AND email='$email'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1) {//do login stuff}
但行总是returns 0。当我从注册和登录中删除散列函数时,它可以正常登录。怎么了?
作为旁注以防万一有人想知道,我会使用 mysqli 但我的虚拟主机的数据库版本是旧的。我相信他们正在使用 5.2。
我忘了说我确实检查过以确保数据库确实与这些图片中看到的相匹配(无法嵌入图片所以链接):
https://drive.google.com/file/d/0B_u6weYp5wTCQng5eVhTSkZFRDg/view?usp=sharing
https://drive.google.com/file/d/0B_u6weYp5wTCQVRXTkNqdzhWUFE/view?usp=sharing
数据库中密码字段的长度是多少???
在我看来,原因是散列密码长度太长,在保存到数据库部分时或被删除...
然后当你比较时你得到 0 行...
好的,我建议您使用 mysql 库以外的准备语句。它更加安全可靠。
$query = "SELECT * FROM `users` WHERE AND `email`=:email_token";
然后准备并执行查询
$data = $connection->prepare($query);
try {
$data->bindParam(":email_token",$_POST["email"],PDO::PARAM_STR);
$data->execute();
}
$result = $data->fetch(PDO::FETCH_ASSOC);
while($row = $result) {
$out = $row["password"];
}
if($out == $_POST["password"]) {
//loggin
} else {
//get lost
}
这是一个非常基本的结构,但本质上您希望先从数据库中提取密码,然后比较字符串,而不是通过查询完成所有操作。
我正在使用 mysql 数据库为我的网站创建登录系统。
当用户注册时,它使用以下方式将密码保存到数据库中:
$password = hash("sha512","somesalt".$password."moresalt");
然后当我登录时,我使用相同的哈希函数将输入的密码与数据库中的密码进行比较。
为了比较我使用的数据库:
$query = mysql_query("select * from users where password='$password' AND email='$email'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1) {//do login stuff}
但行总是returns 0。当我从注册和登录中删除散列函数时,它可以正常登录。怎么了?
作为旁注以防万一有人想知道,我会使用 mysqli 但我的虚拟主机的数据库版本是旧的。我相信他们正在使用 5.2。
我忘了说我确实检查过以确保数据库确实与这些图片中看到的相匹配(无法嵌入图片所以链接):
https://drive.google.com/file/d/0B_u6weYp5wTCQng5eVhTSkZFRDg/view?usp=sharing https://drive.google.com/file/d/0B_u6weYp5wTCQVRXTkNqdzhWUFE/view?usp=sharing
数据库中密码字段的长度是多少???
在我看来,原因是散列密码长度太长,在保存到数据库部分时或被删除...
然后当你比较时你得到 0 行...
好的,我建议您使用 mysql 库以外的准备语句。它更加安全可靠。
$query = "SELECT * FROM `users` WHERE AND `email`=:email_token";
然后准备并执行查询
$data = $connection->prepare($query);
try {
$data->bindParam(":email_token",$_POST["email"],PDO::PARAM_STR);
$data->execute();
}
$result = $data->fetch(PDO::FETCH_ASSOC);
while($row = $result) {
$out = $row["password"];
}
if($out == $_POST["password"]) {
//loggin
} else {
//get lost
}
这是一个非常基本的结构,但本质上您希望先从数据库中提取密码,然后比较字符串,而不是通过查询完成所有操作。