我有一个我刚刚开始的登录脚本。输入新密码时,首先使用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'];
}
}
这只是在测试阶段,所以我试图验证的密码是'密码',为简单起见。如果我输出$ _POST ['password'],我会得到密码 - 但是,如果我输出存储在数据库中的MD5哈希值和md5($ _ POST ['password']),则它们不匹配。后者有额外的字符。任何人都知道为什么会这样吗?
答案 0 :(得分:3)
您的列类型可能会在存储时截断数据。
检查它是否至少为32个字符(MD5哈希的大小)。
此外,此脚本易受SQL注入攻击。
答案 1 :(得分:2)
你的领域太短了。 MD5哈希值有32个十六进制数字。
答案 2 :(得分:1)
有可能被欺骗。检查一下:
$str=md5('password');
print(strlen($str));
,输出为32.(字符串为&#34; 5f4dcc3b5aa765d61d8327deb882cf99&#34;)
现在尝试在html代码中插入:
<?=print(md5('password'));?>
输出为&#34; 5f4dcc3b5aa765d61d8327deb882cf991&#34; (33个字符)
插入时问题会变得清晰:
<?=print(strlen(md5('password')));?>
输出为&#34; 321&#34;
这有效:
<?php print(strlen(md5('password')));?>
答案 3 :(得分:0)
尽管有其他答案,但作为算法的MD5根本不会产生十六进制字符。 MD5是对二进制数据执行的操作。作为输出,它返回16个字节的二进制数据。
这是返回十六进制字符串的PHP函数。这取决于你想要处理哈希输出的方式,如果这是你想要的。如果将哈希存储为二进制数据,则可能需要使用“原始”输出:
string md5 ( string $str [, bool $raw_output = false ] )