【问题标题】:Password Hashing and Verify in CodeIgniterCodeIgniter 中的密码散列和验证
【发布时间】:2018-06-25 03:47:39
【问题描述】:

所以我在尝试使用数据库中存储的密码登录用户时遇到问题:

我目前有这个用于我的登录功能和模型:

控制器:

$username = $this->input->post('username');    
$password = $this->input->post('password');
$enc_password = password_hash($password, PASSWORD_DEFAULT);
$data_user = $this->User_model->login($username, $enc_password);

型号:

public function login($username, $enc_password)
{
    $this->db->where('username', $username);
    $this->db->where("password", $enc_password);
    $this->db->where("password2", $enc_password);

    $query = $this->db->get($this->table);

    $hashed_password = $enc_password;

    if (password_verify($hashed_password, $hashed_password)) {
        return $query->row();
    } else {
        return false;
    }
}

谁能告诉我我的错误在哪里?我试图在输入的密码与创建相同的“密码”和“密码2”匹配后登录用户(在注册函数中;相同的密码哈希)但由于某种原因,即使在我输入了正确的密码。 :/

提前致谢。

【问题讨论】:

  • 先根据用户名取行,再用取到的密码行与提交的输入密码进行校验比较

标签: php codeigniter-3 password-protection password-encryption password-hash


【解决方案1】:

就像我在 cmets 中提到的那样,不要触摸(应用)输入密码上的任何内容。 首先根据用户名获取行。获取经过哈希处理的密码,并与输入的密码进行比较。

这是一个想法:

public function login($username, $password)
{
    // fetch by username first
    $this->db->where('username', $username);
    $query = $this->db->get($this->table);
    $result = $query->row_array(); // get the row first

    if (!empty($result) && password_verify($password, $result['password'])) {
        // if this username exists, and the input password is verified using password_verify
        return $result;
    } else {
        return false;
    }
}

只要确保你的用户表中有password_hashed 密码(我假设你已经处理了这部分)。

所以用法是这样的:

$username = $this->input->post('username');    
$password = $this->input->post('password');
$data_user = $this->User_model->login($username, $password);

只需输入密码,登录时无需哈希。注册时使用password_hash

【讨论】:

  • @Kevin 很高兴这有帮助
【解决方案2】:

请确定,您刚刚在数据库中存储了散列密码
在你的控制器中

$username = $this->input->post('username');    
$password = $this->input->post('password');
$data_user = $this->User_model->login($username, $password);

在你的模型中

public function login($username, $password)
{
   $query = $this->db->query("SELECT * from table where username = $username");

    $row = $query->row();


    if (password_verify($password,$row->password)) {
        return $query->row();
    } else {
        return false;
    }
}

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多