PHP Passwort Hash Abfrage?

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.

http://pastebin.com/eK2TL2Qa

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.

Woher ich das weiß:Berufserfahrung – Entwickle seit > 20 Jahren Anwendungen mit PHP.

Grosslukass 
Fragesteller
 20.06.2016, 13:08

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?

0
Babelfish  20.06.2016, 13:19
@Grosslukass

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:

http://www.peterkropff.de/site/php/mysqli.htm

0

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...


Grosslukass 
Fragesteller
 20.06.2016, 13:05

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 ^^

0
Babelfish  20.06.2016, 13:15
@Grosslukass

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.

1
PeterKremsner  20.06.2016, 20:28
@Grosslukass

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?

0