2014-11-20 6 views
3

UPDATE Так что это ошеломляюще глупый прием, но проблема в том, что хэш-я хранится в базе данных был хэш «пароль» включая цитаты, не было проблем с запросами, которые я написал, проблема была между стулом и клавиатурой.PHP password_hash и password_verify посмотрел всего по-прежнему не работает

Так что это часто задаваемый вопрос, и я просмотрел весь стек stackoverflow и google, пытаясь найти ответ, и у вас так было неудачно.

У меня есть таблица «агентов» с логинами и паролем, назначенными каждому агенту. Поле пароля является VARCHAR с длиной 255.

Вот мой PHP код:

 $conn = new mysqli("localhost", "VABEN", "**********", "VABen"); 
    if($conn->connect_error) 
    { 
     die("Connection failed!" . $conn->connect_error); 
    } 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 

    $s = $conn->prepare("SELECT `agent_password` FROM `VABen`.`agents` WHERE `agent_login`=?"); 
    $s->bind_param("s", $username); 
    $s->execute(); 

    $hash = $s->get_result(); 
    $hash = $hash->fetch_array(MYSQLI_ASSOC); 

    $testpw = password_hash('password', PASSWORD_DEFAULT); 
    echo "Comparing submitted password to locally created hash $testpw which has a length of " . strlen($testpw) . "<br>"; 
    if(password_verify($password, $testpw)) 
    { 
     echo "Password '$password' matches with hash $testpw<br>"; 
    } 
    else 
    { 
     echo "Password '$password' does not match with hash $testpw<br>"; 
    } 
    echo "<br>"; 

    echo "Supplied Password: '$password'<br>"; 
    echo "Queried Hash: " . $hash['agent_password'] . " which has a length of " . strlen($hash['agent_password']) . "<br>"; 
    echo "Result of password_verify: "; 
    if(password_verify($password, $hash['agent_password'])) 
     echo "true<br>"; 
    else 
     echo "false<br>"; 

Я в недоумении. Кажется, что это работает, когда я поставляю локально созданную копию password_hash, и если я тогда использую эту локально созданную копию в базе данных MySQL, она терпит неудачу.

Любые идеи?

+0

И чтобы уточнить, password_verify возвращает true, когда я поставляю локально созданную копию password_hash, но не тогда, когда я поставлю хэш, вытащенный из таблицы MySQL. –

+0

Итак, тест с '$ testpw' работает правильно? Тогда я могу только думать о сохранении хэша в базе данных, что-то не так. Что происходит, когда вы сначала сохраняете '$ testpw', а затем выбираете эту запись из базы данных? – redelschaap

+0

Определить «сбой» – ircmaxell

ответ

1

магазин хэш

Вы проверили, что agent_password хранит хэш порожденный:

password_hash($password, PASSWORD_DEFAULT); 

стандартов Проверить PDO

Возможно не имеет никакого эффекта, но стоит следовать стандарты для отличные реализации bindParam. Если вы используете ? метод, то:

$s->bind_param(1, $username); 

Есть несколько нечетных реализаций PDO в вашем скрипте, попробуйте отрегулировать:

$s->execute(); 

//$hash = $s->get_result(); 
//$hash = $hash->fetch_array(MYSQLI_ASSOC); 
$hash = $s->fetchColumn(); 

Изменить последующие вызовы $hash['agent_password'] к только $hash вместо.

Test Основные операции

Тест на следующие:

// $password = $_POST["password"]; 
$password = "password"; 

Затем, попробуйте также хранить этот хэш, и извлечения его снова, от MySQL, до окончательной проверки стадии.

Наконец

Я глубоко подозреваю, что хранится в agent_password, фактически не зашифрованный пароль с password_hash.

+0

Это выход из того, что я выше: 'Сравнивая пароль локально созданный хэш $ 2y $ 10 $ NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aa, который имеет длину 60' ' '' Password «пароль» совпадает с хэш $ 2y $ 10 $ NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aa' 'Поставляются Password: password'' ' '' опрашивается Hash: $ 2y $ 10 $ 668gODHJ14N7Z6i17lboLOHBQ6mkdxz3g99brUoeoxRBHSeri80ZK, который имеет длину 60' '' ' Результат password_verify: false' –

+0

Хорошо, что у вас это есть. Поставляемый пароль не соответствует сохраненному хэшу пароля. Возможно, изменилось значение 'PASSWORD_DEFAULT' с момента создания этого пароля? –

+0

У вас есть оригинальный пароль для этого пользователя? –