我正在使用https://github.com/dwightwatson/codeigniter-bcrypt的codeigniter-bcrypt和codeigniter。我有一个表单,将帖子数据提交给我的主控制器。然后,我通过模型检查DB的记录。我用过
$hash = $this->bcrypt->hash_password($password);
在帐户创建时哈希密码。它有效。密码在DB中正确散列。但是现在我不确定在哪里使用反向来检查在post的表单中输入的密码是否与DB的哈希密码相同。
if ($this->bcrypt->check_password($password, $stored_hash))
{
// Password does match stored password.
}
else
{
// Password does not match stored password.
}
我模型中的代码是
function getUserByLogin($login, $password) {
$this->db->where('login',$login);
$this->db->where('password',$password);
$result = $this->getUsers();
if (count($result) > 0) {
return $result[0];
} else {
return null;
}
}
function getUsers() {
$query = $this->db->get('users');
if ($query->num_rows() > 0) {
return $query->result();
} else {
return array();
}
}
和我的控制器
if (isset($_POST['email']) && isset($_POST['password'])) {
$login = $_POST['email'];
$password = $_POST['password'];
$user = $this -> user_model -> getUserByLogin($login, $password);
$this -> saveUserToSession($user);
$loggedIn = ($user == null ? false : true);
}
任何帮助都将不胜感激。
答案 0 :(得分:4)
这不会:
$this->db->where('password',$password);
您正在检查数据库中的实际原始密码。
您应该从数据库中获取哈希值,然后将其与用户密码进行比较:
function getUserByLogin($login, $password) {
$this->db->where('login',$login);
$result = $this->getUsers($password);
if (!empty($result)) {
return $result;
} else {
return null;
}
}
function getUsers($password) {
$query = $this->db->get('users');
if ($query->num_rows() > 0) {
$result = $query->row_array();
if ($this->bcrypt->check_password($password, $result['password'])) {
//We're good
return $result;
} else {
//Wrong password
return array();
}
} else {
return array();
}
}
答案 1 :(得分:0)
您应该使用默认的PHP哈希函数
$options = [ 'cost' => 12, ]; echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);