kostenloser Webspace werbefrei: lima-city


Passwort verschlüsselt in MySQL speichern

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    markus7794

    markus7794 hat kostenlosen Webspace.

    Hallo,
    ich habe Seite geschrieben, wo man sich anmelden kann und die Daten in einer MySQL Tabelle gespeichert werden. Auch das Passwort wird dort in einer Zelle gespeichert, jedoch so, dass man es normal lesen kann.
    Ich will nun, dass das Passwort irgendwie verschlüsselt und beim Login dann wieder entschlüsselt wird. Geht soetwas mit PHP.
    Danke für Antworten
    MARKUS
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. t**k

    Probiers mal mit md5().... Das gibt dann einen verschlüsselten String zurück und diesen schreibst du dann in deine Datenbank. Beim Login machst du dasselbe mit dem eingegebenen Passwort und vergleichst das dann mit dem aus der Datenbank.
  4. Heyho
    http://www.phpbuddy.eu/login-systeme-einfach-bis-profi.html kann ich dir empfehlen mal durch zu lesen.
    Kurz gefasst: du solltest die Passwörter als md5 Hash in der Tabelle speichern, damit kannst du sie aber auch nicht mehr auslesen. (Aber wenn jmd sein Passwort vergessen hat, kannst du einfach ein neues generieren). Als weiteren Schutz solltest du dir eine Tabelle anlegen und dort Salts speichern, die an das Passwort angehängt werden, damit die md5 Hashes nicht einfach mit sog. Rainbow Tables verglichen werden können und so trotzdem die Passwörter bekannt werden.

    Mfg
    freaky
  5. Das Passwort zu verschlüsseln ist kein Problem. Jedoch sollte es nicht wieder entschlüsselbar sein. Deswegen greift man in aller Regel zu Einwegverschlüsselungen. Die bekannteste Einwegverschlüsselung ist MD5.

    Prinzipiell bekommst du den MD5-Hash mit diesem Code:
    $hash = md5($password);

    Jedoch wurden im Laufe der Zeit sogenannte MD5-Cracker erfunden. Diese finden die Werte kurzer Strings leicht heraus. Aus diesem Grund verwendet man feste Strings, die man in das Passwort mit einfließen lässt. Das sieht dann so aus:
    $hash = md5($password.'irgendwas');

    Wenn dir auch das nicht sicher genug ist, machst du es so:
    $hash = md5(md5($password.'irgendwas').'nochwas');

    Das ist dann extrem sicher.

    Du musst den String, den du in die Datenbank speicherst du verschlüsseln. Ebenso verschlüsselt du mit diesem Vorgehen das Passwort, das der User zum Login angegeben hat. Stimmen die beiden Werte überein, lässt du den Login zu. In der Spalte, in der der Hash in der Datenbank gespeichert werden soll, musst du 32 Zeichen zulassen. So viele Zeichen spuckt md5() immer aus.

    Beitrag zuletzt geändert: 16.12.2010 19:58:06 von drafed-map
  6. Autor dieses Themas

    markus7794

    markus7794 hat kostenlosen Webspace.

    Danke, dass ich so schnell so gute Antworten bekommen habe!!
    Ich denke, ich krieg das jetzt hin.
    Bis dann
    MARKUS
  7. @drafed-map: a) md5 gilt insbesondere für cryptografische Zwecke für veraltet. Man kann mittlerweile Strings generieren, die einen bestimmten Hash ergeben. Stattdessen sollte ein Hash aus der sha-Familie genutzt werden, wobei auch sha1 bereits erste Schwachstellen aufzuweisen hat. sha512 sollte aber genügen. b) Es ist sehr sinnfrei jedes mal den selben String anzuhängen. Dieser "Salt" muss bei jedem User anders sein, sonst kann er seinen Zweck nicht erfüllen.
  8. Naja, der Kerl muss damit wohl hoffentlich kein Bankkonto absichern. Die Methode, vom Hash aus zu gehen, und nach seinem Muster einen Anfangswert zu finden, funktioniert nicht, wenn man mein letztes Beispiel nutzt. Da ein md5-Hash zusammen mit einem weiteren fixen String durch md5() gequetscht wird, ist der Wert, den das zweite md5() bekommt auf jeden Fall länger, als 32 Zeichen, der Hash aber nur 32 Zeichen lang. Eine Software, die versucht, vom Hash auf den Startwert zu kommen, wird somit einen relativ kurzen String ausspucken, der aber weder mit dem ersten String, noch mit dem Passwort irgendwelche Gemeinsamkeiten aufweist.
    nikic schrieb:
    Es ist sehr sinnfrei jedes mal den selben String anzuhängen. Dieser "Salt" muss bei jedem User anders sein, sonst kann er seinen Zweck nicht erfüllen.
    Ich finde, dass ich diese ausreichend so gekennzeichnet habe, dass der TE diese abändern wird. Ich denke, dass es ebenso offensichtlich ist, dass in aller Regel zwei verschiedene Zeichenketten verwendet werden.
  9. drafed-map schrieb:
    Naja, der Kerl muss damit wohl hoffentlich kein Bankkonto absichern.

    Was aber, wenn die klugen User (und die meistens User sind in genau dieser Art klug) überall das selbe Passwort verwenden? Kommt jemand dann an deine Datenbank heran, beispielsweise durch eine Lücke in deiner Software oder eine Lücke in einer Software, die du nutzt, so kann er gegebenenfalls auch auf andere Konten des betroffenen Users zugreifen. Das ist die grundlegende Idee. Es interessiert niemanden einen Dreck, ob man das Passwort von XY auf drafed-maps persönlicher Homepage kennt - es interessiert nur, dass dieses Passwort wahrscheinlich auch das Passwort von XYs Email-Kontos ist und vieler anderer Dienste.
    Die Methode, vom Hash aus zu gehen, und nach seinem Muster einen Anfangswert zu finden, funktioniert nicht, wenn man mein letztes Beispiel nutzt. Da ein md5-Hash zusammen mit einem weiteren fixen String durch md5() gequetscht wird, ist der Wert, den das zweite md5() bekommt auf jeden Fall länger, als 32 Zeichen, der Hash aber nur 32 Zeichen lang. Eine Software, die versucht, vom Hash auf den Startwert zu kommen, wird somit einen relativ kurzen String ausspucken, der aber weder mit dem ersten String, noch mit dem Passwort irgendwelche Gemeinsamkeiten aufweist.

    Sofern der Algorithmus bekannt ist (und davon sei auszugehen), so ist dies kein sonderlich großes Problem. Zwei md5 Hashes und zwei Konkatenationen erfolgen in Bruchteilen von Millisekunden (das ist eine der Schwachstellen von md5 - er ist zu schnell), man kann Millionen Hashes pro Sekunde generieren. Wenn der User kein sicheres Passwort hat, dann kann eine in wenigen Minuten generierte Hash-Datenbank dazu genutzt werden einen großen Teil der Passwörter aus deiner Datenbank zu erhalten.
    Ich finde, dass ich diese ausreichend so gekennzeichnet habe, dass der TE diese abändern wird. Ich denke, dass es ebenso offensichtlich ist, dass in aller Regel zwei verschiedene Zeichenketten verwendet werden.

    Ich glaube du hast nicht ganz verstanden, was ich meine: Ob zwischen den beiden Hashes ein anderer Salt genutzt wird ist vollkommen belanglos. Es ist nur entscheidend, dass dieser Salt bei jedem Nutzer anders ist. Er muss nicht mal irgendein fancy-long-complicated-random-String sein. Es kann auch einfach nur die User-ID angehängt werden. Das genügt, damit nicht eine Rainbow-Table genutzt werden kann, um alle Passwörter zu erhalten. (Das ist nur die halbe Wahrheit, man sollte kryptographisch starke Zufallszahlen nutzen, aber eine User-ID ist auch ein Anfang)

    Wie oben bereits beschrieben gibt es aber auch unter den Vorsichtsmaßnahmen immer noch Probleme. md5 ist ein sehr schneller Algorithmus, auch wenn man also für jedem Nutzer neu viele Wörter durchtesten muss, so ist dies dennoch in angemessener Zeit möglich. Daher ist es üblich die Hashes zu stretchen. D.h. man wendet den Hash-Algorithmus nicht nur ein Mal an, sondern tausend oder zehntausend Mal. Das macht das erstellen des Hashes beim Login nicht viel langsamer, da dies nur selten erfolgt, aber das systematische Durchprobieren von vielen Wörtern wird stark erschwert.

    function hashPW($string, $salt, $runs = 1000, $algorithm = 'sha512') {
        // some nice big salt
        $salt = hash($algorithm, $salt);
    
        // apply $algorithm $runs times for slowdown
        while ($runs--) {
            $string = hash($algorithm, $string . $salt, $raw);
        }
    
        return $string;
    }
    
    // call
    $hash = hashPW($password, $email);


    Beitrag zuletzt geändert: 16.12.2010 21:38:12 von nikic
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!