1

我最近开始使用 MYSQL 和 PHP 制作登录/注册系统,但我遇到了一个问题,我在注册时对密码进行了哈希处理,但是在登录时,它不起作用,说密码不正确。

http://snap.binarypaw.com/gc53h3w0.png <-- 注册码 http://snap.binarypaw.com/1qhsyeyw.png <-- 登录码

如果有人有任何答案,我会非常高兴。

编辑

此域上的链接现在已失效。对于给您带来的任何不便,我深表歉意。

4

5 回答 5

4

在您的登录代码中,您需要将输入密码的 MD5 哈希版本与您存储的 MD5 哈希版本进行比较。如果哈希匹配,则密码匹配。

实现这一点的最简单方法是在比较输入密码之前对输入的密码进行哈希处理,其方式与您在注册​​码中的方式完全相同:

$query = "SELECT user,pass FROM members WHERE user='$user' AND pass='".md5($pass)."'";

编辑:请记住,这直接回答了您的问题。然而,迈克在上面的评论中提出了一个非常有效的观点。MD5 不是密码散列的好选择,因为它很弱。此外,您不会在散列中加盐。强烈建议进行这两项更改以帮助保护您的用户。右边的一些相关问题,例如这个,值得一看开始。

于 2013-08-02T18:57:26.733 回答
3

其他答案为您的特定问题提供了直接解决方案,但我将详细说明代码背后的安全性 - 仅供您和其他人参考。如有必要,请随时添加或纠正我。

存储密码md5是一个禁忌。这是因为md5散列算法可以很容易/快速地被暴力破解。此外,您使用mysql_已弃用的函数。您应该使用PDO(或mysqli_函数)。幸运的是,您清理了数据 - 但是,这些功能不再维护,因此我建议您切换。

这是一个关于使用 PDO 和 SALT 创建基本登录系统的精彩教程。强烈建议您查看它并使用以下方法重新实现您的登录系统,原因如下:

一般来说,如果您有机会在不给用户带来不便的情况下为您的系统增加更多安全性(例如存储 SALT 和使用强大的散列算法),请提前利用这个机会来减少您将来面临的麻烦。

希望这可以帮助!

于 2013-08-02T19:22:35.503 回答
2

在 where 子句中散列您的密码。

WHERE user ='$user' and pass=md5('$pass')

确保在构建查询字符串之前对 $user 和 $pass 进行了适当的清理。

正如 Mike 在评论中指出的那样,md5 是散列密码的弱选择。

可以在此处找到替代哈希算法https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

于 2013-08-02T18:58:47.017 回答
1
$pass = md5($pass);

也不要使用 mysql_*,因为它已被弃用。

于 2013-08-02T18:56:19.443 回答
0

在您的登录代码中,您需要在查询数据库之前对输入进行哈希处理。插入行:

$pass = md5($pass);

行前$query =

于 2013-08-02T18:56:03.097 回答