在创建用户时使用的password_hash()。
public function create($username, $pass, $user_details) {
if (!$this->user_exists($username)) {
$table = 'users';
$fields_arr = [
'username' => $username,
'password' => password_hash($password,PASSWORD_DEFAULT)
];
$fields_arr += $user_details;
$fields = array_keys($fields_arr);
$values = array_values($fields_arr);
return $this->database->insertQuery($table, $fields, $values);
}
return [];
}
password_verify()在用户登录时使用。
public function user_login($username, $password) {
//@todo how to add variables
$rows = $this->database->selectQuery('users', '*', [
[
'field' => 'username',
'operator' => '=',
'value'=>$username
]
]
);
if (!$rows || password_verify($rows['password'], self::HASH)) {
echo "Username or Password does not exists/match.";
mysqli_close($this->database->conn);
}
else {
// @todo do we need to set setSession as given below ??
$this->setLoggedInSession($username);
$user_obj = new User();
$user = $user_obj->load($_POST['username']);
setcookie('first_name', $user['first_name']);
header("location: welcome.php");
}
}
我已经在HASH下定义了一个常量。在使用password_hash()时需要使用该常量,但我发现要使用我们需要使用PASSWORD_BCRYPT并添加盐据说已被弃用,因此理想的存储密码方式应该是?
PASSWORD_BCRYPT支持的选项:
盐(字符串)-手动提供在对哈希值进行哈希处理时要使用的盐 密码。请注意,这将覆盖并防止盐分 自动生成。
如果省略,password_hash()将为生成随机盐 每个密码都经过哈希处理。这是预期的操作模式。
警告从PHP 7.0.0起不建议使用salt选项。就是现在 首选仅使用默认情况下生成的盐。