我刚开始使用一个登录脚本。当输入新密码时,它首先使用MD5加密,然后存储在数据库中。
当我在登录表单中键入用户名和密码并提交时,我正试图根据$_POST变量验证存储的密码,如下所示:
$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'];
}
}
这只是在测试阶段,所以为了简单起见,我试图验证的密码是"password"。如果我输出$_POST['password'],我会得到密码-但是,如果我输出存储在数据库中的MD5哈希和MD5($_POST['password']),它们不匹配。后者有额外的字符。有人知道为什么会发生这种事吗?
存储数据时,列类型可能会截断数据。
检查它是否至少有32个字符(MD5哈希的大小)。
此外,此脚本易受SQL注入的攻击。
您的字段太短。MD5散列有32个十六进制数字。
有可能上当受骗。检查此项:
$str=md5('password');
print(strlen($str));
并且输出是32。(字符串为"5f4dcc3b5aa765d61d8327deb882cf99")
现在尝试在html代码中插入这个:
<?=print(md5('password'));?>
输出为"5f4dcc3b5aa765d61d8327deb882cf991"(33个字符)
当你插入时,问题变得更清楚了
<?=print(strlen(md5('password')));?>
输出为"321"
这项工作:
<?php print(strlen(md5('password')));?>
尽管有其他答案,MD5作为一种算法根本不会产生十六进制字符。MD5是对二进制数据执行的操作。作为输出,它返回16字节的二进制数据。
它是返回十六进制字符串的PHP函数。这取决于您想要处理哈希输出的方式,如果这是您想要的。如果您将散列存储为二进制数据,您可能希望使用"原始"输出:
string md5 ( string $str [, bool $raw_output = false ] )