хеширование пароля не может войти в систему - PullRequest
3 голосов
/ 03 октября 2019

У меня есть этот помощник для шифрования моего пароля

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');

/*
 * This function used to generate the hashed password
 * @param {string} $plainPassword : This is plain text password
 */
if(!function_exists('getHashedPassword'))
{
    function getHashedPassword($plainPassword)
    {
        return password_hash($plainPassword, PASSWORD_DEFAULT);
    }
}
/**
 * This function used to generate the hashed password
 * @param {string} $plainPassword : This is plain text password
 * @param {string} $hashedPassword : This is hashed password
 */
if(!function_exists('verifyHashedPassword'))
{
    function verifyHashedPassword($plainPassword, $hashedPassword)
    {
        return password_verify($plainPassword, $hashedPassword) ? true : false;
    }
}

?>

Теперь у меня нет проблем с сохранением хешированного пароля в моей базе данных, и я делаю это так:

на моемmodel

function saveAccount($userinfo)
{
    $data = array(
       'username' => $this->input->post('username'),
       'password' => $userinfo,
       'type' => $this->input->post('accountType')
    );

    return $this->db->insert('users', $data);

}

и на моем controller

$userInfo = getHashedPassword($this->input->post('password'));
$this->employee->saveAccount($userInfo);

Сейчас этот процесс регистрации работает, и у меня нет проблем с сохранением его в моей базе данных, теперь моя проблемаявляется то, что всякий раз, когда я пытался войти в систему пользователя, я в настоящее время регистрируется для аналогичного примера. имя пользователя: admin5 пароль: admin5 (который зашифрован в моей базе данных)

на моем контроллере для входа в систему

$username = $this->input->post('username');  
$password = $this->input->post('password');
$user_data = $this->employee->can_login($username,$password);

и на моей модели

function can_login($username, $password)
    {

        $this->db->where('username', $username);
        $this->db->where('password', $password);
        $query = $this->db->get('users');
        $user = $query->result();

        verifyHashedPassword($password, $user[0]->password);
        if($query->num_rows() > 0)
        {
            return $query->row_array();
        }
        else
        {
            return false;
        }
    }

как вы думаете, может быть проблема?

1 Ответ

2 голосов
/ 03 октября 2019

Вы делаете это слишком сложным - действия функций, которые вы используете, не имеют смысла помещать внутрь функции - это простая однострочная строка. И password_verify() уже возвращает логическое значение true / false, поэтому вам также не нужно использовать троичный оператор.

Ваша вставка может быть более четкой и понятной, выполнив следующие действия (и удалив вашу getHashedPassword() функцию),

function saveAccount()
{
    $data = array(
       'username' => $this->input->post('username'),
       'password' => password_hash($this->input->post('password'), PASSWORD_DEFAULT),
       'type' => $this->input->post('accountType')
    );

    return $this->db->insert('users', $data);
}

Тогда в вашей функции can_login() вы не сможете запросить парольв предложении WHERE. Делая это, вы никогда не получите результат обратно (так как хеш не сравнивается через оператор сравнения). Вам нужно получить его, а затем сравнить полученный хеш с помощью password_verify(). Если вы позвоните по номеру verifyHashedPassword() без проверки результата, то волшебным образом ничего не проверите. Теперь вы также можете удалить функцию verifyHashedPassword().

function can_login($username, $password) {
    $this->db->where('username', $username);
    $query = $this->db->get('users');
    $user = $query->result();

    if ($query->num_rows() > 0 && password_verify($password, $user[0]->password)) {
        return $query->row_array();
    } else {
        return false;
    }
}

Ваш столбец password должен иметь длину не менее 60 символов, хотя для учета будущих изменений он может быть длиннее (например, 255 символов). длинный).

...