sha1()用于密码散列

时间:2017-05-09 08:21:27

标签: php

我使用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
 }

我总是得到密码不匹配。 我哪里错了?

1 个答案:

答案 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()的详细信息: