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

Aam*_*mir 0 php mysql passwords login codeigniter

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

$password = password_hash($this->input->post('password'), PASSWORD_BCRYPT);
Run Code Online (Sandbox Code Playgroud)

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

    $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;
    }
Run Code Online (Sandbox Code Playgroud)

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

Rig*_*lly 5

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

如果你看的结果password_hash()存在存储在哪个哈希例程用于创建此哈希散列信息,以及它是如何产生的

$password = 'FredsTheMan';

$hash = password_hash($password, PASSWORD_BCRYPT);

if (password_verify($password, $hash)) { 
   return true;
} else {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

此区域中的另一个常见错误是没有为您在数据库表上使用的列提供足够的字符来保存哈希的完整结果

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

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K
Run Code Online (Sandbox Code Playgroud)

请注意,当其他哈希值提供时,它们可能会导致哈希值超过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;
}
Run Code Online (Sandbox Code Playgroud)