【问题标题】:Crypt returning same hash for two different (similar) passwords地穴为两个不同(相似)密码返回相同的哈希值
【发布时间】:2013-02-08 16:12:40
【问题描述】:

我在使用 crypt() 时遇到问题,如果用户有密码(在本例中为密码 1),并且他们将其更改为密码 2,则散列会返回相同的结果。您可以在此处进行测试:旧链接 输入密码1作为当前密码,输入密码2作为新密码并确认密码,您将看到结果。如果输入完全不相似的密码,则没有问题。我知道还有其他方法可以散列密码等。我比什么都好奇。我的代码如下:

<?php

$oldpassword="password1";

echo "<form method=\"post\">
<p>Enter Current Password: <input type=\"password\" name=\"currentpassword\" /></p>
<p>Enter New Password: <input type=\"password\" name=\"password\" /></p>
<p>Confirm New Password: <input type=\"password\" name=\"confirmpassword\" /></p>
<p><input type=\"submit\" value=\"Change Password\"></p>
</form>";

$user_id = $_SESSION['user_id'];
$pass=$_POST['password'];
$salt = 'xxxxx';
$currentpassword = crypt($_POST['currentpassword'], $salt);
$oldpassword = crypt($oldpassword, $salt);
if(isset($_POST['password'])) {
    if ($currentpassword !== $oldpassword) {
        echo "The password you entered for current password does not match our records.";
    }
    else {
        if ($_POST['password'] && $_POST['confirmpassword']) {
            if ($_POST['password'] == $_POST['confirmpassword']) {
            $hash = crypt($pass, $salt);
                if ($hash == $currentpassword) {
                    echo "Current Password:&nbsp;";
                    var_dump($_POST['currentpassword']);
                    echo "<br/>";
                    echo "New Password:&nbsp;";
                    var_dump($_POST['password']);
                    echo "<br/>";
                    echo "New Hash:&nbsp";
                    var_dump($hash);
                    echo "<br/>";
                    echo "Current Password Hash:&nbsp";
                    var_dump($currentpassword);
                    echo "<br/>";
                    echo "<hr/>";
                    echo "Your new password cannot be the same as your current password.";
                }
                else {
                    echo "Your password has been changed successfully<br/>";
                }
            } else {
                echo "Your passwords do not match. Please try again.";
            }
        }
    }
}

?>

【问题讨论】:

  • 如果您使用 bcrypt,请记住最大密码长度为 55 个字符。您尝试的密码是否比这更长?
  • 你使用的是哪种 crypt() 算法?
  • @TML,似乎将字符串长度限制为 7 个字符。凯文,你不应该尝试为此编写自己的代码。使用 password_hash 或 Github 兼容包(在 cmets 中),它与 PHP 前向兼容
  • 是的,password_hash() 也是我要建议的;我敢打赌,DES 正在被使用。
  • @KevinO'Brien 这就是我在 cmets 中提到 Github 链接的原因。它与 PHP >= 5.3.7 兼容

标签: php hash salt crypt


【解决方案1】:

要使用crypt,您必须提供适当的盐。每个算法都有自己的盐格式。我的猜测是您使用的随机字符很少作为盐,这与任何高级算法都不匹配,因此 php 将您的盐减少到前 2 个字符并回退到基本的DES 算法。 DES 算法最多可散列 8 个字符,password1password2 都是 9 个字符长,因此两者仅使用 password,因此散列相同。

解决方案:为最强的可用算法使用适当的盐格式,为每个密码生成随机盐

推荐解决方案:https://github.com/ircmaxell/password_compat(适用于 php 5.3.7 - 5.4.x)和切换到 php 5.5 后:http://php.net/password_hash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2017-11-15
    相关资源
    最近更新 更多