在SQL数据库和PHP脚本中作用不同的MD5
问题描述:
最近我创建了一个处理我的游戏的登录和注册的脚本,它使用http_get方法更新统计信息。我已经成功地创造了一切,但有一个问题。当用户注册时,它会插入不同的php脚本生成的md5字符串,因此我无法比较密码。在SQL数据库和PHP脚本中作用不同的MD5
这是我插入的MD5字符串转换成数据库的方式:
$pw = md5($password);
$insert = mysqli_query($connect, "INSERT INTO Accounts (username, password, email,reg_ip, wins, looses, experience) VALUES ('$username', '$pw', '$email', '$reg_ip', '0','0', '0')");
if($insert) {
echo "account successfully created";
}
else {
echo "error";
}
这是我检查密码方式:
if($p['password'] == md5($password)) {
echo "login was successful!";
}
else {
echo "incorrect password";
}
这是MD5字符串,它是在数据库当用户注册时:(未加密的字符串是:pocakaj123)
54e8850ba5eca655854ddf1b503943
这是生成的字符串当我回声MD5($密码)。
54e8850ba5eca655854ddf1b50394348
在此先感谢,所有的答案都非常感谢!
答
这是由于您的数据库中的字段长度所致。您需要增加长度,以便整个字符串可以适合。
目前,它仅接受30个字符,因此剩下的被截断:
54e8850ba5eca655854ddf1b503943
你需要增加长度,至少32个,以适应整个字符串:
54e8850ba5eca655854ddf1b50394348
备注:
md5()
不是一个安全的哈希密码方式,更好的方法是bcrypt()
或者改为使用PHP的密码哈希函数,password_hash()
。
原因是md5()
不安全:
散列算法,如MD5,SHA1和SHA256都设计得非常快速,高效。使用现代技术和计算机设备,为了确定原始输入,将这些算法的输出“暴力”变得微不足道。
为什么其中一个只有30个字符? MD5的十六进制是32个字符。 –
你不应该使用'md5'来存储你的密码,所以这个问题是无关紧要的。 –
请参阅:[如何安全存储用户的密码](https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016)。 –