【问题标题】:Comparing mysql password hashes using query row returning 0 (not working)使用返回 0 的查询行比较 mysql 密码哈希(不起作用)
【发布时间】:2015-03-16 14:50:35
【问题描述】:

我正在使用 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,但我的虚拟主机的数据库版本是旧的。我相信他们使用的是 5.2。

我忘了提到我确实检查了数据库是否与这些图片中看到的内容匹配(无法嵌入图片所以链接):

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

【问题讨论】:

  • 您是否将哈希视为纯文本并检查它是否确实存在于数据库中?这将告诉您查询是否错误或该行是否不存在于第一个位置。
  • 基本调试:自己选择行,对比db和s中的hash您计算的哈希值。我敢打赌他们是不同的,这就是为什么您的查询没有返回任何行 - 没有匹配的记录。
  • password 列的长度是多少?它可能太短并削减了哈希值。但是,这些信息太少,无法为您提供适当的帮助。至少将登录脚本添加到您的原始问题中

标签: php mysql hash passwords password-encryption


【解决方案1】:

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

在我看来原因是散列密码长度太长,并且在保存到数据库部分时或它被丢弃......

然后当你比较你得到 0 行...

【讨论】:

  • 哈哈哇。整个密码似乎在数据库中,但我没有检查结尾。原来我的密码是 128 个字符长。我的密码长度设置为只有 100。
【解决方案2】:

好的,我想建议您使用 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好吗?
  • prepared statements 通过将变量从查询语句中取出并将其放入函数中来帮助防止 SQL 注入。它也更加面向对象,您可以在脚本中进行更多的数据操作,这样您就不会受到程序式编程风格的束缚。
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 2021-10-03
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多