sha1()用于密码散列

swi*_*Ser 2 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);
Run Code Online (Sandbox Code Playgroud)

这一切都很好.

问题在这里:

在我的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
 }
Run Code Online (Sandbox Code Playgroud)

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

小智 6

首先是第一个.切勿使用SHA或MCRYPT存储您的密码.

编辑:该password_hash()函数生成一个长密码哈希,所以请确保您的mysql中的列是VARCHAR500空间

所有这些无用的实践是几乎许多网站被黑客攻击的根本原因.为了解决这个问题,php做了很多研究,然后最后得到了最安全的函数叫做password_hash().我不再在password_hash()这里解释,因为互联网上已有很多文件.

你总是可以像这样哈希密码

<?php

$securePassword = password_hash($_POST['password'], PASSWORD_DEFAULT);

$query = $db->query('INSERT INTO users ......');

?>
Run Code Online (Sandbox Code Playgroud)

而且,要验证密码,您只需使用此功能即可

<?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';
}

?>
Run Code Online (Sandbox Code Playgroud)

并回答你的问题.

请不要使用SHA或MCRYPT或BCRYPT.如果你想让你的网站无法访问,那就继续吧.或使用password_hash()

你每次都没有得到哈希处理的原因,因为每次都会openssl_random_pseudo_bytes()产生随机数.因此,每次执行期间,函数都会返回不同的数字,并且您的sha结果会出错,从而发出FALSE警报.

请再说一遍.我鼓励你使用password_hash()功能


有关更多信息,password_hash()password_verify():