Php MD5哈希中存在额外字符的问题?
我有一个刚刚开始的登录脚本。输入新密码时,首先使用MD5对其进行加密,然后将其存储在数据库中 当我在登录表单中键入用户名和密码并提交它时,我试图根据$u POST变量验证存储的密码,如下所示:Php MD5哈希中存在额外字符的问题?,php,mysql,encryption,md5,Php,Mysql,Encryption,Md5,我有一个刚刚开始的登录脚本。输入新密码时,首先使用MD5对其进行加密,然后将其存储在数据库中 当我在登录表单中键入用户名和密码并提交它时,我试图根据$u POST变量验证存储的密码,如下所示: $username = $_POST['username']; $password = md5($_POST['password']); //database stuff here $q = mysql_query("SELECT * FROM Users WHERE username='$usernam
$username = $_POST['username'];
$password = md5($_POST['password']);
//database stuff here
$q = mysql_query("SELECT * FROM Users WHERE username='$username'");
while ($row = mysql_fetch_array($q))
{
if ($row['password'] == $password)
{
echo "Passwords match.";
}
else
{
echo "Password is incorrect.";
echo "<br />Entered password: " . $password;
echo "<br />Stored password: " . $row['password'];
}
}
$username=$\u POST['username'];
$password=md5($_POST['password']);
//这里是数据库
$q=mysql_查询(“从用户名为“$username”的用户中选择*);
while($row=mysql\u fetch\u数组($q))
{
如果($row['password']==$password)
{
回显“密码匹配”;
}
其他的
{
echo“密码不正确。”;
echo“
输入的密码:.$password;
echo“
存储的密码:.$row['password'];
}
}
这只是在测试阶段,为了简单起见,我尝试验证的密码是“password”。如果我输出$_POST['password'],我将获得密码-但是,如果我输出存储在数据库中的MD5哈希值和MD5($_POST['password']),它们不匹配。后者有额外的字符。有人知道为什么会这样吗?您的字段太短了。MD5散列有32个十六进制数字。存储数据时,列类型可能会截断数据 检查它是否至少为32个字符(MD5哈希的大小)
此外,此脚本容易受到SQL注入的攻击。尽管有其他答案,MD5作为一种算法根本不会生成十六进制字符。MD5是对二进制数据执行的操作。作为输出,它返回16字节的二进制数据 返回十六进制字符串的是PHP函数。如果这是您想要的,则这取决于您想要处理散列输出的方式。如果将哈希存储为二进制数据,则可能需要使用“原始”输出:
stringmd5(string$str[,bool$raw\u output=false])
可能会被欺骗。选中此项:
$str=md5('password');
print(strlen($str));
输出为32。(字符串为“5f4dcc3b5aa765d61d8327deb882cf99”)
现在,尝试在html代码中插入以下内容:
<?=print(md5('password'));?>
输出为“5f4dcc3b5aa765d61d8327deb882cf991”(33个字符)
插入以下内容后,问题会变得更清楚:
<?=print(strlen(md5('password')));?>
输出为“321”
这项工作:
<?php print(strlen(md5('password')));?>
1。MD5是一个非常弱的算法,使用SHA-2家族的一些东西,例如SHA-256。2.给你的密码加盐。3.使用PDO和准备好的语句进行数据库连接。谢谢大家的提示@Crozin:当你这么做的时候,最好建议bcrypt或PBKDF2使用高迭代次数和每个密码的salt,而不仅仅是散列和salt…我意识到这个脚本很脆弱-这是一个初出茅庐的尝试。现在它只是本地主机,在上线之前会被增强=)