我最近开始使用MYSQL和PHP创建一个登录/注册系统,但是我遇到了一个问题,即我在注册时对密码进行了哈希处理,但是当涉及到登录时,它将不起作用,说不正确密码。
http://snap.binarypaw.com/gc53h3w0.png< - 注册码 http://snap.binarypaw.com/1qhsyeyw.png< - 登录代码
如果有人有任何答案,我会非常高兴。
修改
此域名上的链接现已停止。对由此带来的任何不便,我们深表歉意。
答案 0 :(得分:4)
在您的登录代码中,您需要将输入密码的MD5哈希版本与您存储的MD5哈希版本进行比较。如果哈希值匹配,则密码匹配。
实现这一目标的最简单方法是在输入密码之前对输入密码进行哈希处理,方法与在寄存器代码中完全相同:
$query = "SELECT user,pass FROM members WHERE user='$user' AND pass='".md5($pass)."'";
编辑:请记住,这会直接回答您的问题。然而,Mike在上面的评论中提出了一个非常有效的观点。 MD5不是密码散列的好选择,因为它很弱。另外,你没有腌制你的哈希。建议高度进行这两项更改,以帮助保护您的用户。右边的一些相关问题,例如this one,值得一看就开始了。
答案 1 :(得分:3)
其他答案为您的特定问题提供了直接的解决方案,但我会详细说明代码背后的安全性 - 仅供您和其他人参考。如有必要,请随意添加或纠正我。
在md5
中存储密码是禁忌。这是因为md5
哈希算法可以轻松/快速地强制执行。此外,您还使用了mysql_
函数,这些函数已被弃用。您应该使用PDO(或或 mysqli_函数)。幸运的是,您对数据进行了清理 - 但是,这些功能已不再维护,因此我建议您进行切换。
This is a great tutorial关于使用PDO和SALT创建基本登录系统。我高度建议您查看它并使用这样的方法重新实现您的登录系统,原因如下:
一般情况下,如果您有机会为系统添加更多安全性而不会给用户造成不必要的不便(例如存储SALT并使用强哈希算法),请提前抓住机会,以减少您将面临的问题。将来
希望这有帮助!
答案 2 :(得分:2)
在您的where子句中哈希密码。
WHERE user ='$user' and pass=md5('$pass')
确保在构建查询字符串之前对$ user和$ pass进行了适当的清理。
正如迈克在评论中指出的那样,md5是散列密码的弱选择。
可在此处找到替代哈希算法https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html
答案 3 :(得分:1)
$pass = md5($pass);
也不要使用mysql_ *,因为它已被弃用。
答案 4 :(得分:0)
在您的登录代码中,您需要在查询数据库之前对输入进行哈希处理。插入一行:
$pass = md5($pass);
在$query =
行之前。