PHP Passwort Hash Abfrage?
Hallo zusammen,
Ich habe mich jetzt seit einigen Tagen mit dem hashen von Passwörtern und generell mit einem Loginsystem bei PHP und MySQL beschäftigt. Das einfache registrieren ohne das Passwort in einem Hashcode umzuwandeln hat perfekt funktioniert!
Jetzt habe ich es schon geschafft, dass das Passwort in einen Hashcode beim registrieren umgewandelt wird. Wenn ich mich einloggen will und den Hashcode NICHT über die Datenbank abfrage, sondern ihn direkt in die Datei schreibe, funktioniert das ganze an sich auch schon.
Jetzt zum Problem: Wenn ich jetzt aber versuche das eingegebene Passwort mit dem aus meiner Datenbank zu vergleichen, dann stimmen die Passwörter nicht überein und der Login schlägt Fehl!
Daraus lässt sich schließen, dass sich das gehashte passwort aus der Datenbank nicht richtig auslesen lässt! Aber ich verstehe nicht warum (?)
Hier nochmal der ganze Quellcode: http://pastebin.com/B0Z8yP7V
3 Antworten
Mit einem blick auf das hier:
$passwordhashed = mysql_query("SELECT password FROM user WHERE username='$username'");$passwordhashedstring = (string)$passwordhashed;
findet sich der Fehler schnell.
Du vergleichst hier das eingegebene Passwort mit der Result ID und nicht mit den PW aus der DB.
$arr_pw = mysql_fetch_array($passwordhashed);
$passwordhashedstring = $arr_pw[0];
if(password_verify('password', $passwordhashedstring)) {
Sollte hier funktionieren wenn das PW in die DB Spalte gepasst hat.
Alternativ vergleich das ausgelesenen PW aus der DB mit dem gehaschten eingegebenen.
mfg
Schau dir mal die PHP-Doku zu mysql_query an. Die Funktion bringt keinen String zurück und damit kann dein Hash nicht stimmen. Zum Debuggen empfehle ich, immer mal die verwendeten Werte mit einem echo ausgeben zu lassen, damit du siehst, wo es klemmt.
Davon abgesehen solltest du von Anfang an wenigstens die MySQLi-Funktion mysqli_query nutzen, da alles andere spätestens ab PHP 7 nicht mehr unterstützt wird.
Der Hinweis von Peter, einen Salt zu nutzen, ist auch wichtig.
Mit mysql_fetch_array nutzt du doch schon eine entsprechende Funktion. Wenn du das vorher schon machst und dir ID und Passwort zurückgeben lässt, kannst du dir sogar eine Abfrage sparen.
Es gibt viele Anleitungen zu MySQLi im Netz. Eine ist hier:
Das kommt drauf an welche Codierung deine Datenbank verwendet und wie viele Zeichen dein Feld in der Datenbank lang ist.
Wenn du das Feld auf 60 Zeichen limitiert hast kannst du darin keinen Hash mit mehr 60 Zeichen speichern.
Für den SHA512 Hash benötigst du je nach repräsentation unterschiedliche Längen, wenn du den Wert als Hexadezimal Speicherst brauchst du dazu 128 Zeichen, wenn du ihn als Base64 Speicherst brauchst du 88 Zeichen, wenn du ihn als Bits speicherst brauchst du 512 Zeichen...
Nur als kleine Anmerkung verwende auch noch einen Salt dazu...
Danke schonmal für die Antwort!
Also ich benutze den in meiner Datenbank den Typ "Text" der 65.535 Zeichen lang sein kann. Ich weiß jetzt nur nicht ob "Text" = "String" bedeutet, weil es an sich die Codierung "String" nicht gibt.
P.S. Ich verwende phpMyAdmin als für meine Datenbank und der Salt kommt dann am Ende hinzu, wenn das erstmal funktioniert ^^
Definitiv besser ist es, einen VARCHAR mit der benötigten Länge zu nutzen. Der Type TEXT ist für größere und von der Länge nicht vorhersehbare Felder gedacht.
Ja Text ist string, aber nimm wie von Babelfish vorgeschlagen VARCHAR.
Ist der Hash den du in der DB stehen hast, per Phpmyadmin ausgelesen gleich wie der Hash der dir von der Hashfunktion zurückgegeben wird?
Verwende zur Überprüfung nicht den == Operator sondern lass dir beide anzeigen und vergleiche sie durchs hinsehen.
In welchem Format speicherst du deinen Hash eigentlich?
Danke für den Hinweis!
Ich werde die MYSQL-Funktion nochmal überarbeiten ^^
Gibt es denn eine passende Funktion die einen String zurück gibt bzw. kann ich die Rückgabe nicht in String umwandeln?