我希望我的登录密码是安全的。所以我开始使用PHP的crypt()函数在将密码插入数据库之前对其进行哈希处理。但是在比较转换后的哈希密码的用户输入密码时遇到了麻烦。这是我的代码:
<?php
$password = 'hello_password';
# A higher "cost" is more secure
$cost = 10;
# Create a random salt
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
# Blowfish algorithm.
$salt = sprintf("$2a$%02d$", $cost) . $salt;
$salted_password = $password . $salt; // apply salt to password
# hash the password
$hash_password = hash('sha256', $salted_password);
$userInput = 'hello_password'; // suppose this is the user input password
if (hash('sha256',$userInput) == $password) {
echo "Password Verified.";
}
else {
echo "Incorrect Password";
}
&GT;
但它始终显示密码不正确,尽管我的密码是正确的。我不想使用“hash_equals”函数,因为我目前的PHP版本不支持它。有人可以帮我弄这个吗 ?谢谢
答案 0 :(得分:1)
您正在将散列用户输入与实际用户密码进行比较。所以当然这永远不会起作用。
你基本上问的是hash =='hello_password'。哈希将永远不会匹配,这是哈希的整个点。您也没有在用户输入中使用salt。
你用一个很好的盐哈希实际密码:
$salted_password = $password . $salt; // apply salt to password
# hash the password
$hash_password = hash('sha256', $salted_password);
所以你需要用盐来哈希用户输入,方法如下:
$salted_input = $userInput . $salt; // apply salt to user input
# hash the input
$hash_input = hash('sha256', $salted_input);
然后,您可以将$hash_input
与$hash_password
进行比较。
您也没有正确使用盐。盐应该用于存储密码以防止彩虹表攻击。在比较时随机生成盐以应用于输入和密码是没有意义的。