php password_verify nicht die Arbeit mit Datenbank
Ich bin mit php 5.4 mit dieser rückwärts-Kompatibilität-Skript: https://github.com/ircmaxell/password_compat/blob/master/lib/password.php
dass sollte keine Rolle spielen, obwohl, weil ich kann das hashing und überprüfung der Arbeit in meiner Registrierung-Funktion:
$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
aber immer wenn ich versuche zu speichern den hash in einer MySQL-Datenbank und dann abrufen es für die verify-Funktion, die es schlägt immer fehl. Hier ist mein login-Funktion:
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
Mein 'Passwort' - Spalte hat dieser Datentyp: VARCHAR(255) NOT NULL
Kein php-Fehler auftauchen, so ist das einzige was ich mir vorstellen kann ist, dass der hash-Wert wird nicht formatiert, in der gleichen Weise, wenn es kommt aus der Datenbank, wenn es ging, aber wenn ich echo die Werte, Sie scheinen identisch zu sein.
Wie sonst kann ich Debuggen /was ist falsch an meinem code?
Dank
UPDATE:
Das hat definitiv etwas mit der Codierung:
$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
wie kann ich formatieren Sie die SQL-Wert entsprechend der Leistung von password_hash? Hier ist, was ich versucht habe:
(string)$hash
utf8_encode($hash)
wenn ich das Tue:
$hash = settype($hash,"string");
if($hash == $hardcode_hash)
gibt true zurück, aber password_verify($pass, $hash)
noch gibt false zurück,
Die meisten SO in diesen Tagen 🙂
Sie könnten, präsentieren die Probe
$pass
und $hash
Ausgabe. Niemand ist in der Lage Test Ihrem code-Auszug.Verwenden
var_dump
. Wenn die Saiten waren wirklich identisch sind, gibt es doch gar nicht scheitern, im zweiten Fall.Haben Sie die Codierung Ihrer Seiten/db, ist es möglich, dass eine variable enthält einen multibyte-string, während die anderen nicht?
InformationsquelleAutor Cbas | 2014-12-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem gefunden. als ich dies Tat:
gedruckt 90, das ist seltsam, denn es gab definitiv keine Leerzeichen am Ende, wenn ich ausgedruckt Erfolg/Fehler-Meldung, und das Feld hat den Datentyp varchar Länge 255
Fügte ich diese Zeile:
Und jetzt funktioniert es einwandfrei.
Seine seltsam, dass niemand scheint zu haben, laufen Sie in dieser Ausgabe. Es gibt ähnliche Beiträge über password_verify, aber keiner von Ihnen erforderlich, diese conversion-Typ, oder jede Konvertierung, die Frage:
php password_verify nicht funktioniert
password_verify php nicht mit
http://forums.phpfreaks.com/topic/283407-need-help-with-password-verify/
Mit PHP 5.5 password_hash und password_verify Funktion
Eine Sache, die mich stört ist dieser verhindert, dass der code von vorwärts-kompatibel. Wie werde ich wissen, dass der hash ist 60 Zeichen lang sein, wenn die Standard-änderungen?
hinzufügen, um Eingänge von @martinstoeckli, es wäre besser, verwenden
CHAR
Daten geben Sie für die Hash-Passwort-Feld in der Datenbank und stellen 60 als seine Länge auf überPASSWORD_BCRYPT
konstant. In diesem Fall wird der hash wird immer 60 Zeichen lang sein.Links zu anderen Lösungen führte mich zu der Antwort. Danke! Genauer gesagt, es war "password_verify nicht arbeiten" , führen mich zu meiner Lösung.
Ich hatte das gleiche Problem. Ich habe versucht, trim($hash) statt substr() und es funktioniert!
markieren Sie diese als Antwort @GAV
InformationsquelleAutor Cbas
Nur für zukünftige Referenz. Ich hatte das gleiche Problem mit den Passwörtern Versagen ohne Grund. Wenn ich nahm einen genaueren Blick auf Sie, sah ich, dass das Passwort-Feld in der Datenbank war nicht groß genug, um die vollständige hash-so dass einige Zeichen abgeschnitten wurden. Nach Erhöhung der Größe der Datenbank-Feld, es funktionierte perfekt.
InformationsquelleAutor Kobus
Ich hatte das gleiche Problem Sie hatte mit dem es nicht funktioniert, aus irgendeinem Grund scheint es zu helfen, setzen die:
in den code, obwohl mein string war schon 60 Zeichen lang sein.
InformationsquelleAutor Lexix
Ich hatte das gleiche Problem und es war immer noch nicht funktioniert, trotz Gewährleistung meine Datenbank-Spalten vom Datentyp varchar(255), dass die hashes wurden 60 Zeichen, und die Gewährleistung meine Codierung wurde UTF-8 auf der ganzen Strecke. Ich bin ziemlich neu in PHP und SQL, damit ich nicht vorgeben, genau zu verstehen, warum es funktionierte, aber ich schaffte es, es zu beheben, so dass ich hoffe, dieser Beitrag hilft anderen Leuten mit dem gleichen problem.
Es stellte sich heraus, dass die zugrunde liegenden Grund password_verify() nicht überprüfen, meine hashes war, da hatte ich eine vorbereitete Anweisung verwendet, die eine gespeicherte Prozedur, die zuvor im Skript ohne das abrufen alle Ergebnisse von der Abfrage korrekt zu deaktivieren Sie den Puffer vor dem schließen und erneuten öffnen der Verbindung zum ausführen der folgenden Abfrage. Aufruf next_result() auf die mysqli_link nach dem schließen der Anweisung wird sicherstellen, dass alle Ergebnisse verzehrt werden.
Zusätzlich war ich dann mit einem anderen vorbereitete Anweisung mit einer gespeicherten Prozedur, um den Einsatz für das Passwort, aber ich musste noch telefonieren zu store_result() und free_result (), obwohl keine Resultsets zurückgegeben wurden, einfügen. Ich gehe davon aus, dass die Kombination dieser Dinge war, verdirbt meine Daten irgendwo entlang der Linie, was in password_verify() false zurückgeben, auf scheinbar identische hashes.
Diese Antwort war für ein anderes problem, aber ich fand es nützlich für das lernen, wie man richtig schließen Sie vorbereitete Anweisungen mit gespeicherten Prozeduren.
InformationsquelleAutor DBC