使用查询行返回0来比较mysql密码哈希值(无效)

3

我正在使用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}

但是,行始终返回0。当我从注册和登录中删除哈希函数时,它可以正常登录。有什么问题吗?

顺便提一下,如果有人想知道,我会使用mysqli,但我的webhosting的数据库版本太旧了。他们正在使用5.2版本。

我忘了提到我确实检查过数据库是否与这些图片中得到的匹配(无法嵌入图片,因此附上链接):

https://drive.google.com/file/d/0B_u6weYp5wTCQng5eVhTSkZFRDg/view?usp=sharing https://drive.google.com/file/d/0B_u6weYp5wTCQVRXTkNqdzhWUFE/view?usp=sharing


你是否查看了哈希值的明文,并检查它是否实际存在于数据库中?这将告诉你查询是否有误或者该行是否根本不存在。 - Jake N
基本调试:自己选择行,然后比较数据库中的哈希值和您计算的哈希值。我打赌一枚闪亮的便士它们是不同的,这就是为什么您的查询没有返回任何行 - 没有匹配的记录。 - Marc B
“password”列的长度是多少?它可能太短而会截断哈希。但这些信息太少了,无法正确地帮助您。请至少在原始问题中添加登录脚本。 - kero
2个回答

3

好的,我建议您使用预处理语句而不是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
}

这是一个非常基本的结构,但实质上您需要先从数据库中提取密码,然后比较字符串,而不是全部使用查询操作。


我对网站开发还比较新,但我非常擅长使用谷歌来完成任务。我以前在示例中看到过这个,但它到底是什么?与我之前见过的所有内容相比,语法看起来非常陌生。它有什么好处?为什么它更可靠?它比mysqli更好吗? - microzee
预处理语句通过将变量从查询语句中取出并放入函数中来防止 SQL 注入。它还更加面向对象,您可以在脚本中进行更多的数据操作,因此不会受到过程式编程的限制。 - KingJames

3

您的数据库密码字段长度是多少?

我认为原因是散列密码长度太长,在保存到数据库时部分被丢弃...

然后当您进行比较时,会得到0行...


哈哈,哇。整个密码似乎都在数据库中,但我没有检查结尾。结果发现我的密码长度达到128个字符。我之前将密码长度设置为100。 - microzee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接