2014-12-22 24 views
9

używam PHP 5.4 z tego skryptu wstecznej kompatybilności: https://github.com/ircmaxell/password_compat/blob/master/lib/password.phpphp nie password_verify pracy z bazą danych

że nie powinno mieć znaczenia, chociaż, bo mogę dostać proces mieszającego i weryfikacji pracy w mojej funkcji rejestracji:

$hash = password_hash($pass, PASSWORD_DEFAULT); 

echo $pass; 
echo $hash; 

if(password_verify($pass,$hash)) 
    echo 'success'; 
else echo 'failure'; 

//success is always shown 

//EXAMPLE INPUT 
$pass = 'password'; 

//EXAMPLE OUTPUT 
password$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYSsuccess 

ale za każdym razem, gdy próbuję zapisać hasz w bazie danych MySQL, a następnie pobrać go do funkcji weryfikacji, zawsze kończy się niepowodzeniem. Oto moja funkcja logowanie:

function user_login($mysqli, $email, $pass){  

     $err_msg = 'login: '.$mysqli->error.' | '.$email; 

     if($stmt = $mysqli->prepare('SELECT password FROM users WHERE email=?')) : 

      if(!$stmt->bind_param('s', $email)) log_sql_error($err_msg); 
      if(!$stmt->execute()) log_sql_error($err_msg); 
      if(!$stmt->bind_result($hash)) log_sql_error($err_msg); 
      if($stmt->fetch() === FALSE) log_sql_error($err_msg); 
      if(!$stmt->close()) log_sql_error($err_msg); 

      //I can see that these values are identical to the ones 
      //echoed out in the registration function 
      echo $pass; 
      echo $hash; 

      if(password_verify($pass,$hash)) 
       echo 'success'; 
      else echo 'failure'; 

     else : log_sql_error($err_msg); 
     endif; 
} 
//failure is always shown 

//EXAMPLE INPUT 
$pass = 'password'; 

//EXAMPLE OUTPUT 
password$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYSfailure 

My „password” kolumna ma tego typu danych: VARCHAR(255) NOT NULL

Brak błędów php pokazać się więc jedyne co mogę myśleć o to, że wartość hash nie jest sformatowana w w ten sam sposób, gdy wychodzi z bazy danych, kiedy wchodzi, ale kiedy echo wartości, wydają się być identyczne.

Jak inaczej mogę debugować ten/co jest nie tak z moim kodem?

Dzięki

UPDATE:

To na pewno ma coś wspólnego z kodowaniem:

$hardcode_hash = '$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS'; 

echo $hash; 
echo '<br/>'; 
echo $hardcode_hash; 
echo '<br/>'; 

if($hash == $hardcode_hash) 
    echo 'success'; 
else echo 'failure'; 

//OUTPUT 
$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS 
$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS 
failure 

jaki sposób zmiany formy wartość SQL pasujące wyjście password_hash? Oto, co starałem:

(string)$hash 
utf8_encode($hash) 

jeśli robię:

$hash = settype($hash,"string"); 

if($hash == $hardcode_hash) powraca prawda, ale password_verify($pass, $hash) nadal zwraca false

+1

, który obniża pytanie bez pozostawienia komentarza lub odpowiedzi? Nie pomocne ... – Cbas

+2

Większość z tych dni :-) – user4166144

+1

Możesz pokazać przykładowe wyjście '$ pass' i' $ hash'. Nikt nie może przetestować fragmentu kodu. – mario

Odpowiedz

9

znaleźć problem. kiedy to zrobił:

echo strlen($hash) 

ona drukowana 90, co jest dziwne, bo było zdecydowanie nie obowiązuje na koniec, kiedy wydrukowany komunikat powodzenie/niepowodzenie, a pole ma długość varchar z 255

Dodałem tę linię:

$hash = substr($hash, 0, 60); 

A teraz działa dobrze.

To dziwne, że nikt inny nie wpadł na ten problem. Istnieją podobne posty o password_verify, ale żaden z nich nie wymaga tego typu konwersji, ani żadnej konwersji dla tej sprawy:

php password_verify not working

password_verify php not match

http://forums.phpfreaks.com/topic/283407-need-help-with-password-verify/

Using PHP 5.5's password_hash and password_verify function

jedna rzecz niepokoi mnie to, że zapobiega to kompatybilności kodu do przodu.Skąd będę wiedzieć, że hash ma długość 60 znaków, gdy domyślne zmiany?

+0

To naprawdę nie powinno być konieczne. Czy na pewno jest to pole varchar, a nie char *? Być może mógłbyś również rzucić okiem na ten mały [artykuł] (http://www.martinstoeckli.ch/php/php.html#utf8) na temat używania UTF-8 do php (kodowania) i bazy danych (charset). Kod, który wstawia hasz do bazy danych, również może być interesujący. – martinstoeckli

+2

dodając do wejść @martinstoeckli, lepiej byłoby użyć typu danych "CHAR" dla hashowanego pola hasła w bazie danych i ustawić 60 jako jego długość przy użyciu stałej 'PASSWORD_BCRYPT'. W tym przypadku wartość mieszania będzie zawsze wynosić 60 znaków. –

+1

Twoje linki do innych rozwiązań doprowadziły mnie do odpowiedzi. Dzięki! Konkretnie było to "password_verify not working", które doprowadziło mnie do mojego rozwiązania. –

2

Tylko na przyszłość. Miałem ten sam problem z błędami haseł bez powodu. Kiedy się z nim bliżej przyjrzałem, zobaczyłem, że pole hasła w bazie danych nie było wystarczająco duże, aby przechowywać pełny skrót, więc niektóre znaki zostały odcięte. Po zwiększeniu rozmiaru pola bazy danych działało idealnie.

2

miałem ten sam problem, trzeba było z nim nie działa z jakiegoś powodu wydaje się, aby pomóc kładzenie:

$hash = substr($hash, 0, 60); 

do kodu chociaż mój ciąg był już długości 60 znaków.