Gehahschte Passwörter

  • Hey zusammen,


    undzwar ich erstelle grad ein regestrierformular und da ist es ja wichtig passwörter zu hashen.


    ich habe es bis jetzt so aufgebaut in php:





    Welche Hash-Algorythmen würdet ihr mir empfehlen von denen : ?


    Wenn ich zuerst die eingabe vom password feld im paddword speichere ist
    das password ja nicht geschützt oder ? Erst nachdem man es gehahst hat?
    Ich würde dann das gehahschte Password in der Datenbank speichern falls alle eingaben stimmen und noch nicht besetzt sind.


    Was haltet ihr von meiner Vorgangsweise? Wie würdet ihr es machen ? Mache ich es so richtig ?


    Gruß,
    Stef

    Dieser Beitrag wurde bereits 5 Mal editiert, zuletzt von Stef ()

  • Erstmal: sehr schön, dass Du PHP password_hash() nutzen möchtest.

    Zitat

    Welche Hash-Algorythmen würdet ihr mir empfehlen von denen : ?


    Keinen. Lass das die PHP Funktion password_hash() machen,
    wie Du es schon richtig gemacht hast:

    PHP
    1. $password_gehahst = password_hash($password, PASSWORD_DEFAULT);


    Der Parameter 2 $algo in password_hash()
    gibt den verwendeten Algorithmus an.
    PASSWORD_DEFAULT legt dabei fest, dass nach PHP Standard immer der best mögliche Algo verwendet wird.
    Siehe: http://php.net/manual/en/password.constants.php


    Zitat

    Wenn ich zuerst die eingabe vom password feld im paddword speichere ist
    das password ja nicht geschützt oder ?


    Verstehe ich nicht ganz. Aber wenn Du meinst, dass zB $_POST['password'] unsicher ist,
    oder es unsicher ist, das Klartextpasswort irgendwo abzuspeichern (db, file, session(was auch ein file ist)),
    dann - JA, Klartextpasswörter dürfen nie irgendwo gespeichert werden.


    Es wird ein Hash vom Klartextpasswort gespeichert (zB db),
    und später mit dem Hash des zu verifizierenden Passwortes (zB Login) gegengeprüft.
    Dafür nutzt Du dann aber password_verify()


    Zitat

    Ich würde dann das gehahschte Password in der Datenbank speichern falls alle eingaben stimmen und noch nicht besetzt sind.


    Erst, wenn alle benötigten Felder ausgefüllt wurden - erst dann fängst Du an zu "arbeiten".
    Soll heißen: Sind alle required Fields ausgefüllt - Ja - Dann erstelle (erst) jetzt den Passworthash.
    Warum:
    Jedes hashen kosten Ressourcen. Bei password-hash() kannst Du eine "cost" mitgeben. (mehr zu "cost" auf php.net oder im oben genannten Link).
    Und Du möchtest ja nicht erst den aufwendigen Hash erstellen lassen, um in dann wieder fallen zu lassen, weil zB der Benutzername zukutz ist.


    Zitat

    Was haltet ihr von meiner Vorgangsweise? Wie würdet ihr es machen ? Mache ich es so richtig ?


    Ich sehe da nicht ganz durch.
    Das erste was ich sehe (un MIR nicht gefällt) ist:

    PHP
    1. $password = trim($_POST['password']);


    Der User wollte evtl am Anfang oder Ende ein Leerzeichen im PW. Du veränderst hier seine Eingabe.
    Das macht noch Sinn, wenn es um Namen geht (Username).
    Aber beim Passwort ist meine Meinung: Benutzers Passwort ist des Benutzers Passwort und wird nicht angerührt.
    Ich nenne es immer gern wieder: Sparkasse kürzt EINGEGEBENE Passwörter auf 5 order 6 zeichen, OHNE den Benutzer zu informieren. (Bei Vergabe und Login!)


    Es ist zwar viel, aber ich denke wir hatten damals im Thread "passwort richtig hashen" (Link oben) so ziemlich alles abgearbeitet.
    Einfach mal ansehen. Bei Fragen wie immer fragen.
    (Beachte auch password_verify() und password_needs_rehash())

  • Hey,


    Aso Ok.


    Ich meine:


    Z.b wenn ich jetzt das Password nach der eingabe erst in eine variable speicher und danach dieses erst hashe, dann ist es doch nicht so sicher ?


    Ja da hast du recht. Hab nicht drauf geachtet.


    Ich kann dieses Thema hier nicht finden. Wo ist es denn ?



    Gruß,


    Stef

  • Opps, hatte ich den Link vergessen :D


    Wenn Du im Script das Passwort in Variablen steckst, dann kann im Normalfall nichts passieren.
    Der Wert - hier das Passwort - wird ja beim setzen einer Var im Normalfall nicht irgendwo hin gespeichert (außer im Speicher (RAM)).


    Es gibt aber Situationen, in denen "etwas schief gehen kann". Dann kann es sein, dass der Wert einer Var an die "Öffentlichkeit" gelangen kann.


    Bsp:
    Simples Bsp für Verkettungsfehler:


    Ausgabe:

    Code
    1. Hallo cottton!mySecr3tP455w0rD... something to tell ...


    Was passierte hier?
    (Siehe Comments)


    In kurz:


    Anderes Bsp: Exceptions
    (Vorraussetzung hier, dass Fatal Errors angezeigt werden. Aber auch in den Logs kann das pw auftauchen!)


    Ausgabe (weil Exception nicht aufgefangen)

    Code
    1. Fatal error: Uncaught exception 'Exception' with message 'OOooops!' in [...]: User->setPassword('mySecr3tP455w0r...') #1 {main} thrown in [...]


    Die PHP Fehlermeldung gibt einen Fatal Error aus, mit der Angabe WO das passiert ist.
    Dabei zeigt uns die Meldung blöderweise, dass die Funktion ::setPassword() aufgerufen wurde und der Wert "mySecr3tP455w0r..." als Parameter übergeben wurde.


    Dieser Fehler - also das ausgeben von Fatal Errors - passiert wohl öfter mal beim Verbinden zu einer db. Man sollte das also kennen und try/catch nutzen, um genau das zu vermeiden

  • Hey,


    Ja, ok. Gut zu wissen. Und danke für die ausführliche Erklärung.


    Wenn ich nun aber z.b. möchte das nach dem login dann oben rechts im dropdownmenu z.b. der Name des Useres drin steht.


    Nach deiner sicht soll man dies nicht machen:

    Zitat

    $string = 'Hallo ' . htmlspecialchars($username) . '!' . // HIER hat jemand was vergessen!
    // sowas passiert, wenn man dort eigtl noch was schreiben/anhängen wollte,
    // das dann aber vergessen hat.
    // (sowas also gleich gar nicht angewöhnen =)


    $password = $_POST['password'];

    Wie würdest du es dann machen ? Würdest du den Namen dann aus der Datenbank laden und dann ausgeben ?


    Gruß,
    Stef

  • Guck Dir das Bsp nochmal an. Da fehlt das Semikolon =)
    Und das ist der Punkt bei diesem Bsp.


    Was ich damit zeigen wollte ist, dass ein Passwort (oder andere sensible Daten) in einer Var gut aufgehoben sind.
    Aber man muss aufpassen, was man mit der Var im Script macht.


    So ein Fehler sollte sehr selten vorkommen. Wichtig ist nur, dass man sowas kennt/schon mal gesehen hat/wüsste was passiert/... .
    =)


    Den Username kannst Du anzeigen lassen, wo Du willst.