Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MD5哈希中存在额外字符的问题?_Php_Mysql_Encryption_Md5 - Fatal编程技术网

Php MD5哈希中存在额外字符的问题?

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

我有一个刚刚开始的登录脚本。输入新密码时,首先使用MD5对其进行加密,然后将其存储在数据库中

当我在登录表单中键入用户名和密码并提交它时,我试图根据$u 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'];
    }
}
$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…我意识到这个脚本很脆弱-这是一个初出茅庐的尝试。现在它只是本地主机,在上线之前会被增强=)