我最近进行了一次对话,这让我发现我一直在不正确地存储密码。我一直使用md5并认为它足够安全。但经过一些阅读后我发现并非如此,因此我正在转向bcrypt
无论如何,我正在创建登录处理器,但是一旦我用已知的salt加密用户提供的密码,它就说明密码不相等,但是当我回复它们时,它们是相同的。
以下是代码:
$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的建议
答案 0 :(得分:2)
不要使用echo
或至少在没有硬边界的情况下不使用它。否则,您具有与以下两行似乎生成相同输出的相同情况:
print "hello"
print "hello "
使用var_dump
或者,如果必须回显,则回显变量,使HTML呈现器不会填充输出,例如使用<pre>
带有[
和]
分隔符的代码。