2014-01-10 4 views
1

У меня есть следующий пароль:password_hash и password_verify возвращает ложные

123 

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

$2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J 

Теперь я пытаюсь проверить тот же ключ, используя:

return password_verify(123, $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J); 

однако это возвращает false.

Может ли кто-нибудь сказать мне, почему?

Update

это мой полный код:

<?php 
/** 
* Created by JetBrains PhpStorm. 
* User: Marc 
* Date: 14-12-13 
* Time: 13:56 
* To change this template use File | Settings | File Templates. 
*/ 
class Security { 
    /** 
    * @param $string 
    * @return mixed 
    */ 
    public function encrypt($string) { 
     return password_hash($string, PASSWORD_DEFAULT); 
    } 

    /** 
    * @param $string 
    * @param $hash 
    * @return mixed 
    */ 
    public function validate($string, $hash) { 
     return password_verify($string, $hash); 
    } 
} 

    $hash = $this->db->template("SELECT password FROM User WHERE username = '".$username."'", READ_FROM_QUERY)['password']; 
$validate = $this->getSecurity()->validate($password, $hash); 

Я пытаюсь вставить следующую строку:

Helloworld 

Однако $validate = false;

Пароль должен возвращается к $2y$10$VbicsFaGN9d3ggQTNYIto.Bp6x/rbjpsBe2kneEhJ9oP2KdPsZ7hy

Если я попробовать перефразировать, он возвращает то же значение Су они должны быть равны друг другу, так почему не возвращает ложь?! ??!

Возвращает ложь, а

$validate = $this->getSecurity()->validate((string)$password, (string)$hash); 
+0

Попробуйте передать пароль password_verify() как строку –

+0

Как вы создали этот хеш? 'password_verify()' работает только с паролем 'password_hash()' hashed passwords?!? – loveNoHate

+0

Хорошо, давайте попробуем и перефразируем мой вопрос –

ответ

8

Для первого примера, с паролем 123, проблема заключается в том, что вы усечение хэша.

$settings = array('cost' => 10, 'salt' => 'rSq.2M7Ikc.QPhVtYlp1Nu');           
echo password_hash('123', PASSWORD_BCRYPT, $settings); 
// $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J/WWUma/RrNWKFay // What is echoed 
// $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J    // Your hash 

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

Для второй строки проблема заключается в том, что где-то вдоль линии вы преобразуете пароль в нижний регистр.

// Uppercase 'H' 
$settings = array('cost' => 10, 'salt' => 'VbicsFaGN9d3ggQTNYIto.'); 
echo password_hash('Helloworld', PASSWORD_BCRYPT, $settings); 
// $2y$10$VbicsFaGN9d3ggQTNYIto.qFAer7kUmKmcy6y9RCNzaaKD7fJraba 

// Lowercase 'h' 
$settings = array('cost' => 10, 'salt' => 'VbicsFaGN9d3ggQTNYIto.'); 
echo password_hash('helloworld', PASSWORD_BCRYPT, $settings); 
// $2y$10$VbicsFaGN9d3ggQTNYIto.Bp6x/rbjpsBe2kneEhJ9oP2KdPsZ7hy 

Так что, когда вы пытаетесь проверить с помощью Helloworld он возвращает ложь, так как хэш для helloworld.

Вам действительно нужно быть более осторожным, потому что обе эти ошибки являются неосторожными. И обратите внимание, что НИКОГДА не следует преобразовывать пароли в определенный случай (верхний или нижний), потому что это значительно ослабляет их.

+0

Это может быть актуально, начиная с http://php.net/crypt --- * «Стандартная криптова() на основе DES возвращает соль в качестве первых двух символов вывода.Он также использует только первые восемь символов str, поэтому более длинные строки, начинающиеся с тех же восьми символов, будут генерировать одинаковый результат (когда используется одна и та же соль). »* –

+1

@ Fred-ii- Интересно ... однако password_hash использует только bcrypt прямо сейчас (обратите внимание, что строка начинается с '$ 2y $'). – Mike

+0

Я думал, что это может быть такая же или подобная ситуация. –

Смежные вопросы