gpt4 book ai didi

php - 当给定的哈希值存储在 MySQL 数据库中时,password_verify 无法按预期工作

转载 作者:行者123 更新时间:2023-11-29 17:47:08 25 4
gpt4 key购买 nike

我正在使用 CodeIgniter 框架在 PHP 中创建一个应用程序。

我成功创建了一个注册页面,用户可以在其中输入他们的电子邮件地址和密码。我使用 password_hash(password, PASSWORD_DEFAULT) PHP 函数将用户密码存储在数据库中。我已确保该列是长度为 255 的 VARCHAR。

在我的用户模型中,我具有以下功能:
用户模型:

public function insert_user($emailAddress, $password, $firstName, $lastName){
$data = array(
'email' => $emailAddress,
'password' => password_hash($password, PASSWORD_DEFAULT),
'firstName' => $firstName,
'lastName' => $lastName
);

if(! $this->emailExists($emailAddress)){
$this->db->insert('users', $data);
return true;
} else {
return false;
}
}

public function emailExists($emailAddress){
$query = $this->db->get_where('users', array('email' => $emailAddress));
if($query->num_rows() == 0){
return false;
}
return true;
}

//Only use this function if you know that the email is already stored in db
public function getPassword($emailAddress){
$query = $this->db->get_where('users', array('email' => $emailAddress));

$row = $query->row();
$password = $row->password;

return $password;
}

这是我处理登录的 Controller
登录:

    class Login extends CI_Controller {

public function index(){
$this->load->helper(array('form', 'url'));
$this->load->model('User_model');
$this->load->library('form_validation');

$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('email', 'Email', 'valid_email|required');

if ($this->form_validation->run() == FALSE){
$this->load->view('login');
} else {
$email = $this->input->post('email');
$password = $this->input->post('password');

if($this->User_model->emailExists($email)){
$storedPassword = $this->User_model->getPassword($email);
if(password_verify($password, $storedPassword)){
echo 'passwords match';
} else {
echo 'passwords dont match';
}
} else {
echo 'email doesnt exist';
}
}
}
}

对应的 View :
登录

<html>
<head>
<title>Login</title>
</head>
<body>
<?php echo validation_errors(); ?>
<?php echo form_open('Login'); ?>

<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo set_value('email');?>" size="50" />

<h5>Password</h5>
<input type="text" name="password" value="<?php echo set_value('password');?>" size="50" />

<div><input type="submit" value="Submit" /></div>
</form>
</body>
</html>

当我尝试使用之前注册的电子邮件地址和密码组合登录时,它总是显示密码不匹配。

我不知道为什么这不起作用。我在数据库中插入或检索密码是否错误,这可能会改变哈希值?

最佳答案

如果 $storedPassword 正如您所期望的那样 - 与用户的电子邮件定义的密码字段中的哈希值相匹配的哈希值 - 那么它一定意味着用户提供的密码不匹配t 与数据库中的匹配;因为这是剩下的唯一合乎逻辑的选择。

我会重新开始,并使用新密码创建一个新用户,然后看看它是否有效。 请记住,数据库中的password字段应等于或大于255个字符(varchar(255))(也许您的字段不够大,因此只能一些哈希值正在被存储 - 可以解释你的问题)。

Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).

http://php.net/manual/en/function.password-hash.php

关于php - 当给定的哈希值存储在 MySQL 数据库中时,password_verify 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49713541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com