Enschlüsselung des Passwortes beim Login

  • Hallo!


    Ich möchte ein gehashtes Passwort beim Login wieder entschlüsseln. Ich probiere nun schon einige Zeit herum, doch ich bekomme es nicht hin.


    An welcher Stelle muss die password_verify geschrieben werden?

  • Hey,


    ein durch password_hash verschlüsseltes Passwort kannst du nicht entschlüsseln.


    Wenn du vor hast die Passwörter miteinander zu vergleichen gibt es die Function password_verify();


    Gegenfrage: Wo würdest du password_verify() einsetzen ?


    Schöne Grüße,

    Stef

  • Du bekommst:

    username

    password


    Du suchst in der db nach dem username, der unique sein muss. Oder Du geht nach email, die ja auch unique sein muss.

    Findest Du den User, dann prüfst Du das password gegeb den hash.


    Pseudo code:

    Code
    1. user = "select ... from user where username = :username"
    2. if ! user
    3. // fehler - user nicht gefunden
    4. else
    5. // check input vs db users hashed pw
    6. if password_verify(password, user.hash)
    7. // ok
    8. else
    9. // nicht ok

    Siehe auch Loginpasswort richtig hashen - password_hash() & password_verify()

  • Zitat

    Gegenfrage: Wo würdest du password_verify() einsetzen ?


    Code
    1. // Verbindung zur MySQL-Daten aufbauen
    2. 17. $conn = mysqli_connect("localhost", "root", "", "users");
    3. 18.
    4. 19. // SQL-Abfrage zum Abfragen von Informationen registrierter Benutzer und Ermitteln der Benutzerübereinstimmung.
    5. 20. $query = "SELECT username, password FROM login WHERE username=? AND password=? LIMIT 1";

    Ich hätte mir gedacht dass ich Password_verify() im Anschluss an die SQL-Abfrage (hier Zeile-Nr. 20) schreiben müsste?

  • ein durch password_hash verschlüsseltes Passwort kannst du nicht entschlüsseln.

    Habe da mal eine doofe Frage zu.

    Habe mal gelesen das man den erstellten hash nicht entschlüsseln kann und es dafür auch kein Tool gibt ( Brute Forces zählt nicht ).

    Php muß ja eine Formel oder Algorithmus nutzen um so einen hash zu erzeugen.


    Ist das echt ausgeschloßen das man den hash nicht knacken kann ?

    Der Php Entwickler der den hash erstellt ( erfunden und programmiert ) hat, könnte er den hash knacken ?

  • Der Php Entwickler der den hash erstellt ( erfunden und programmiert ) hat, könnte er den hash knacken ?

    Hi Basti,


    das das mit dem Hashen ist etwas anderes als verschlüsseln. Beim Verschlüsseln wird der Eigentliche Inhalt durch einen schlüssel so verändert das nur der den Schlüssel kennt, den Ursprungswert wieder Entschlüsseln / Lesen kann.


    Code
    1. Einfaches beispiel: Cesar / Rot13 verschlüsselung (hier mal googeln)
    2. Text ist ABCD Rot13 rotiert einfach das Alphabet um 13 Zeichen Damit ist dann A = N, B = O, C = P usw.
    3. Unser eispiel ABCD wird zu NOPQ. Wer den Schlüssel kennt (13) kann es zurückverwandeln. Du kannst den Schlüssel auch frei wählen
    4. bei 1 wäre es A = B, C = D usw.


    Zum Hashen: lange zeit waren md5 und dann SAH1 ausreichend.


    Das Hashen berechnet einen immer gleich langen wert aus den gegebenen Daten, dabei verliert man aber den Ursprungswert komplett. Die einfachste Hash-Funktion die mir als beispiel einfällt, ist das berechnen der Quersumme.


    Code
    1. Bsp.: die Zahl 1234 hat die erste Quersumme 1+2+3+4 = 10 Zweite Quersumme 1+0 = 1. Damit wäre der Hash von 1234 = 1. Aber von 1 auf 1234 zu kommen ist unmöglich.

    Das Quersummen beispiel zeigt aber auch, wo die Problematik von Hashs liegen, denn die Quersumme 1 hat auch die zahl 10, 100, 1000, 10000 usw.

    md5 ist deshalb an einigen stellen unsicher geworden, weil wir mittlerweile so viel Rechenleistung haben, das man schnell nach neuen werten Suchen kann, die den gleichen Hashs haben. (Grund, md5 hat 32AlNum stellen, durch die Begrenzung haben wir schon mehr Daten die in Hashs umgewandelt werden können, als md5 platz bietet). Deswegen wurden hier neue Methoden entwickelt (die weit Komplexer sind um einen höchstmöglichen 'zufall' zu haben).


    Daher ist die Frage ob auch der Entwickler das Knacken kann, zu verneinen, aber vor dem Entwickler muss man da auch keine Angst haben, da die Standards oder die Logik wie eine Verschlüsselung / Hash berechnet wird, "allen" bekannt ist, solange man genormte Methoden nutzt.


    Die frage ist eher, haben die Entwickler von PHP Sicherheitslücken in ihrem Code und da kann man nur sagen, weiß man erst, wenn eine gefunden wurde. (Stichwort Hearthbleed).


    Nochmal zur Sicherheit: Die Algorithmen dahinter sind Sicher, so lange wie das Zufällige berechnen zu lange dauert (man rechnet hier dann von 100/1000/10000 Jahren Rechenzeit).


    Wenn wir Rot13 nehmen um den text zu entschlüsseln muss man den ganzen text bei einem Alphabet von 26 Zeichen, also nur 26 mal durchlaufen lassen um die Lösung zu finden. Bei den Quersummen mit einer stelle muss ich nur 10 (0-9) Kollisionen erzeugen, was Computer in Millisekunden schaffen. Mehr Komplexität = Mehr zeit = Mehr Sicherheit.


    Hoffe das hilft,


    Grüße


    Timo

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von timtim () aus folgendem Grund: Morgens im halb schlaft geschrieben.

  • Hey,

    Code
    1. // Verbindung zur MySQL-Daten aufbauen
    2. 17. $conn = mysqli_connect("localhost", "root", "", "users");
    3. 18.
    4. 19. // SQL-Abfrage zum Abfragen von Informationen registrierter Benutzer und Ermitteln der Benutzerübereinstimmung.
    5. 20. $query = "SELECT username, password FROM login WHERE username=? AND password=? LIMIT 1";

    Ich hätte mir gedacht dass ich Password_verify() im Anschluss an die SQL-Abfrage (hier Zeile-Nr. 20) schreiben müsste?


    An dieser Stelle hast du die Query einer Variable zugewiesen - dort hast du noch keine Daten. Die Daten aus der Datenbank müssen vorhanden sein damit du diese Passwortabfrage ausführen kannst.


    Führe die Query aus und lese dann die Daten aus der Datenbank. Dann hast du ein Array mit den Einträgen und kannst auf diese zugreifen. Danach kannst du die Abfrage ausführen.


    Grüße,

    Stef

  • Ich hätte mir gedacht dass ich Password_verify() im Anschluss an die SQL-Abfrage (hier Zeile-Nr. 20) schreiben müsste?

    "WHERE username=? AND password=?"

    ^ das funktioniert nicht.


    Du bekommst das plain text (klartext) Passwort.

    Du hast (in Deiner db) den hash des Passwortes.


    Du lädsts den User bei username oder email.

    Findest Du ihn, dann nimmst Du den zugehörigen hash und nutzt password_verify() um den das Passwort mit dem Hash zu vergleichen.

  • Die Password_verify macht mir Schwierigkeiten. Ich habe nun folgende Code erarbeitet:

    Dieser Beitrag wurde bereits 4 Mal editiert, zuletzt von romae ()

  • Zitat

    $_SESSION["login_user] = $username;

    Danke!

    Das ist mir soeben auch aufgefallen!

    Dieser Beitrag wurde bereits 2 Mal editiert, zuletzt von romae ()

  • Nun schreibt mir das Programm, dass in der Zeile 14 das ELSE überflüssig sein soll.

    Wenn ich das ELSE raus lösche, erhalte diese Meldung zwar nicht mehr, aber nach Eingabe von User und Passwort erscheint eine Notiz das in Zeile 27 (password_verify) was nicht passt. Kann mir bitte jemand helfen. Danke!

  • Ich fang jetzt nicht wieder mit Prepared Statements an. Das solltest Du nun kennen.

    Aber

    SELECT * FROM login WHERE username = '$username'

    Wenn im Moment, und|order in der Zukunft ein Fehler passiert,

    bei dem der username nicht (mehr) unique ist,

    dann kannst Du mehr als 1 user laden.


    Der code lässt dann auch noch zu, dass Du solange läufst, bis Du den letzten möglichen user eingeloggt hast.


    Pseudo code Vorschlag:

    Code
    1. result = SELECT * FROM login WHERE username = :username LIMIT 1;
    2. if result.count === 1
    3. row = result->fetchOne() // you expect one, so get one
    4. if password_verify(password, row.password)
    5. // all fine
    6. elseif result.count > 1
    7. // error handling for unexpected multiple users on same username
    8. else
    9. // error handling for user not found by username