我使用 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
}
我总是收到密码不匹配的消息。 我哪里出错了?
最佳答案
第一就是第一。 切勿使用 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()
的更多信息:
关于php - sha1() 用于密码哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43864666/