如何使用php的password_hash()方法..?

时间:2016-02-28 14:11:18

标签: php mysql codeigniter login passwords

我登录时收到的密码不匹配, 当用户注册时,我将密码保存为

$password = password_hash($this->input->post('password'), PASSWORD_BCRYPT);

当用户登录我正在检查这样的密码时,

    $hash = password_hash($password, PASSWORD_BCRYPT);
    $this->db->select('password');
    $this->db->from('usersdetails');
    $this->db->where('email', $email);
    $this->db->limit(1);
    $query = $this->db->get();
    $passwordcheck = $query->row()->password;
    if (password_verify($passwordcheck, $hash)) {
       return true;
    } else {
        return false;
    }

但它总是返回密码不匹配..为什么????? 非常感谢任何帮助...

1 个答案:

答案 0 :(得分:5)

您应该检查原始未散列密码,因为password_verify()使用创建散列密码时使用的哈希例程重新散列原始密码。

如果你查看password_hash()的结果,那么哈希中存储的信息是关于使用哪个哈希例程来创建这个哈希,以及它是如何生成的

$password = 'FredsTheMan';

$hash = password_hash($password, PASSWORD_BCRYPT);

if (password_verify($password, $hash)) { 
   return true;
} else {
    return false;
}

这方面的另一个常见错误是没有给你在数据库表上使用的列足够的字符来保存哈希的完整结果

使用PASSWORD_BCRYPT生成的哈希是60个字符

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

请注意,当其他哈希值提供时,它们可能会导致哈希值超过60个字符

简而言之,你的代码应该是

$this->db->select('password');
$this->db->from('usersdetails');
$this->db->where('email', $email);
$this->db->limit(1);
$query = $this->db->get();
$pwd_from_db = $query->row()->password;

if (password_verify($this->input->post('password'), $pwd_from_db)) {
   return true;
} else {
    return false;
}