我使用sha1来保护我的密码。我已经以这种方式在register.php
中存储了密码// secure password
$salt = openssl_random_pseudo_bytes(20);
$secured_password = sha1($password . $salt);
//Send it to mysql table
$result = $access->registerUser($username, $secured_password, $salt, $email, $fullname);
这一切都很好。
问题出在这里:
在我的login.php中
$password = htmlentities($_POST["password"]);
$secure_password = $user["password"];
$salt = $user["salt"];
// 4.2 Check if entered passwords match with password from database
if ($secure_password == sha1($password . $salt)) {
//do something
} else {
//do something
}
我总是得到密码不匹配。 我哪里错了?
答案 0 :(得分:6)
首先是第一个。 永远不要使用SHA或MCRYPT来存储密码。
编辑:password_hash()
函数生成一个长密码哈希,因此请确保mysql中的列是VARCHAR
500空间
所有这些无用的做法是几乎所有网站被黑客攻击的根本原因。为了解决这个问题,php进行了大量的研究,最后得到了最安全的函数password_hash()
。我不再在这里解释password_hash()
,因为互联网上已有很多文件。
您始终可以像这样哈希密码
<?php
$securePassword = password_hash($_POST['password'], PASSWORD_DEFAULT);
$query = $db->query('INSERT INTO users ......');
?>
而且,要验证密码,您只需使用此功能
即可<?php
$passwordHash = $query['password']; //Password from database
$userPassword = $_POST['password']; //Password from form
if(password_verify($userPassword, $passwordHash)) {
echo 'Password is correct, logged in!';
} else {
echo 'Password is wrong, try again';
}
?>
并回答你的问题。
请不要使用SHA或MCRYPT或BCRYPT。如果你想让你的网站无法访问,那就继续吧。或使用password_hash()
每次都没有得到哈希处理的原因,因为openssl_random_pseudo_bytes()
每次都会生成随机数。因此,每次执行期间,函数都会返回不同的数字,导致sha
结果错误,从而发出FALSE
警报。
请再说一遍。我鼓励你使用password_hash()
功能
有关password_hash()
和password_verify()
的详细信息: