【问题标题】:Issue with extra character in MD5 Hash?MD5 哈希中的额外字符问题?
【发布时间】:2012-02-28 11:27:15
【问题描述】:

我有一个刚刚开始的登录脚本。输入新密码时,首先使用 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']),它们不匹配。后者有额外的字符。有人知道为什么会这样吗?

【问题讨论】:

  • 1. MD5 是一个非常弱的算法,使用来自 SHA-2 系列的东西,例如。 SHA-256。 2. 给你的密码加盐。 3. 使用 PDO 和prepared statements 进行数据库连接。
  • 感谢大家的提示!
  • @Crozin:当您使用它时,最好建议 bcrypt 或 PBKDF2 具有较高的迭代次数和每个密码的盐值,而不仅仅是散列和盐......

标签: php mysql encryption md5


【解决方案1】:

您的列类型可能会在您存储数据时截断数据。

检查它是否至少有 32 个字符(MD5 哈希的大小)。

此外,此脚本易受 SQL 注入攻击。

【讨论】:

  • 我意识到这个脚本是脆弱的 - 这是一个初出茅庐的试验。现在它只是本地主机,它会在上线之前得到加强=)
【解决方案2】:

您的字段太短。 MD5 哈希有 32 个十六进制数字。

【讨论】:

    【解决方案3】:

    有可能被骗。检查这个:

    $str=md5('password');
    print(strlen($str));
    

    输出为 32。(字符串为“5f4dcc3b5aa765d61d8327deb882cf99”)

    现在尝试在 html 代码中插入这个:

    <?=print(md5('password'));?>
    

    输出为“5f4dcc3b5aa765d61d8327deb882cf991”(33 个字符)

    插入后问题会更清楚:

    <?=print(strlen(md5('password')));?>
    

    输出为“321”

    这行得通:

    <?php print(strlen(md5('password')));?>
    

    【讨论】:

      【解决方案4】:

      尽管有其他答案,MD5 作为一种算法根本不会产生十六进制字符。 MD5 是对二进制数据执行的操作。作为输出,它返回 16 字节的二进制数据。

      返回十六进制字符串的是 PHP 函数。如果这是您想要的,这取决于您想要处理哈希输出的方式。如果您将哈希存储为二进制数据,您可能希望使用“原始”输出:

      string md5 ( string $str [, bool $raw_output = false ] )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2012-10-10
        • 2012-08-17
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        相关资源
        最近更新 更多