1

我最近的一次谈话让我发现我一直在不正确地存储密码。我一直使用 md5 并认为它足够安全。然而,经过一番阅读,我发现情况并非如此,因此我正在切换到 bcrypt

无论如何,我正在创建登录处理器,但是一旦我用已知的盐加密用户提供的密码,它就会指出密码不相等,但是当我回显它们时,它们是相同的。

这是代码:

$username = $_POST['username'];
$password = $_POST['password'];

/*find that username in the database and grab their info*/
$check_username = "SELECT * FROM users WHERE username = ?";
    $query_username = $conn->prepare($check_username);
            $query_username->execute(array($username));
                $count = $query_username->rowCount();

    if($count > 0)/*if the user was found in the database*/
        {       
while($row = $query_username->fetch())
            {
                $salt = $row['salt'];
                $password_encrypted = $row['password'];
                $encrypt_password = crypt($password, $salt);

                if ($encrypt_password == $row['password'])
                    {
                        echo "success";
                    }
                else
                    {
                        var_dump($encrypt_password);
                        echo "<br />";
                        var_dump($row['password']);
                    }
            }
}

不知道为什么这个 if 语句会失败,希望你们中的一个人能看到我所缺少的。提前致谢。

输出vardumps:

string(60) "$2y$09$l2j89a6l7eoaz4dqpn5xzeAyBP1l7QzQuT7rIj8qYWX1/qJz7MYee" 
string(61) "$2y$09$l2j89a6l7eoaz4dqpn5xzeAyBP1l7QzQuT7rIj8qYWX1/qJz7MYee"

发现错误,我使用二进制作为将字符串更改为 60 的列解决了这个问题。感谢您提供有关使用 vardump 的建议

4

1 回答 1

2

不要使用echo或至少不要在没有严格界限的情况下使用它。否则,您将遇到与以下两行相同的情况,它们似乎生成相同的输出:

print "hello"
print "hello     "

使用var_dump或者,如果您必须回显,则以 HTML 渲染器不会填充您的输出的方式回显变量,例如使用<pre>带有[]分隔符的标签。

于 2013-05-27T03:40:45.623 回答