PHP — проблема с проверкой пароля

Я ломал голову над этим более 2 часов. Я исследовал статьи о stackoverflow, в том числе:

И я не смог исправить свою проблему. Я был бы признателен за некоторые указания о том, насколько я идиот:

Функция для вставки данных в базу данных MySQL:

function insertUser($userObj) {
    $query = $this->databaseConnection->getStntPrepare()->prepare(
            "INSERT INTO user(username, userpassword) VALUES (?,?);");
    $username = $userObj->getUsername();
    $password = password_hash('testing1234', PASSWORD_BCRYPT);

    $query->bind_param('ss', $username, $password);
}

Подтверждение входа пользователя путем получения данных из MySQL:

function findUser($userObj) {
    $query = $this->databaseConnection->getStntPrepare()->prepare(
            "SELECT userid, userpassword 
                FROM user 
                WHERE username=?");

    $pass = 'testing1234'
    $query->bind_param('s', $userObj->getUsername());
    $query->execute();
    $query->bind_result($userid, $hash);

    while ($query->fetch()) {

        if (password_verify($pass, $hash)) {
            echo 'Password is valid!';
        } else {
            echo 'Invalid password.';
        }
    }
}

При запуске я получаю «Неверный пароль».

Когда я делаю следующее без вставки в базу данных, а затем извлекаю:

$hash = password_hash('testing1234', PASSWORD_BCRYPT);
if (password_verify('testing1234', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

Я получаю «Пароль действителен!»

Я считаю, что моя проблема связана с одинарными и двойными кавычками и интерпретацией знака доллара ($) в поле пароля как переменной вместо буквального (как предлагает одна из статей) при сохранении/извлечении из базы данных MySQL - однако Мне не повезло в решении. Ниже приведено хеш-значение «testing1234»:

$2г$10$1/oQEuYX67n.U3usxH.7tenNq7hT2dKyBSIZsy5xR3W


person Lewis Wheeler    schedule 10.11.2013    source источник
comment
Какой тип данных у вашего поля userpassword в базе данных? Какое значение вы видите, если вы echo $hash непосредственно перед вызовом password_verify()? (Также: попробуйте echo strlen($hash)...)   -  person Matt Gibson    schedule 10.11.2013
comment
Хорошо поймал! varchar(40) был проблемой. Расширил и теперь разобрался. Спасибо за помощь!   -  person Lewis Wheeler    schedule 10.11.2013


Ответы (1)


Проблема была в базе данных - ничего общего с password_verify или password_hash. Тип данных имел максимальное количество символов (определенное только до 40, как это было сделано MySQL при создании таблиц). Перешел на 60 и больше никаких проблем.

person Lewis Wheeler    schedule 10.11.2013
comment
почему вы всегда должны запускать строгий режим ;) сделало бы проблему очевидной. - person hanshenrik; 18.09.2015