Michael: MD5 Verschlüsselung und mysql

Hallo,

ich hätte eine vielleicht naive Frage, bei der ich mir auch nicht ganz sicher war, ob ich sie dem richtigen Themenbereich zugeordnet habe:

Wird bei der Verwendung einer md5 Verschlüsselung ein Passwort von verschiedenen Anwendungen gleich erzeugt und somit das Gleiche in eine Datenbank geschrieben?

Problem ist folgendes:
Ich möchte mit einer PHP-Seite Zugangsdaten (Benutzername und Passwort(md5)) erstellen lassen. Damit soll ein Login zu einer anderen Anwendung auf meinem Server ermöglicht werden, die auf JSP und Java basiert. Das klappt leider nicht, da sich die PHP-md5 Passwörter von denen die via JSP-md5 erzeugt werden unterscheiden.

Bin für jeden Tipp dankbar.

Viele Grüße

Michael

  1. Hiho,

    soweit ich weiss ist md5 ein fester hash-Algorithmus der nicht von irgendwelchen äußerungen Bedingungen abhängt, sondern immer gleich berechnet wird (sonst würden so Dinge wie md5 Prüfsummen für Dateien ja auch vollkommen hinfällig werden). Sicher das sich nicht die Eingaben bei deinem Problem unterscheiden (vielleicht noch ein unsichtbares Zeichen oder so).
    Teste es doch mal ganz einfach. Mach mal ein

    <?php
    md5("test");
    ?>

    und das äquivalent dazu in Java/JSP. Da kannste ja erkennen ob sich da was unterscheidet oder nicht (wie gesagt, meiner Meinung nach darf sich da eigentlich nichts unterscheiden).

    Marc

    1. Hallo nochmal,

      und danke für die Hilfe.

      ...
      soweit ich weiss ist md5 ein fester hash-Algorithmus der nicht von irgendwelchen äußerungen Bedingungen abhängt

      Hätte ich mir eigentlich auch gedacht. War mir nur nicht ganz sicher.

      Teste es doch mal ganz einfach. Mach mal ein

      <?php
      md5("test");
      ?>

      und das äquivalent dazu in Java/JSP. Da kannste ja erkennen ob sich da was unterscheidet oder nicht (wie gesagt, meiner Meinung nach darf sich da eigentlich nichts unterscheiden).

      Hab ich natürlich schon ausprobiert - eben mit dem Ergebnis, dass sich die Resultate unterscheiden.

      Vielleicht wird das Passwort bei der JSP-Anwendung doch nicht mit md5 erzeugt (entgegen einem Vermerk in der Doku dazu). Oder es wird außer durch md5 noch durch etwas anders zusätzlich bearbeitet.
      Auffällig ist bei allen JSP-erzeugten Passwörtern, dass das erste Zeichen immer ein * ist.
      Hat das vielleicht was zu bedeuten?

      Vielen Dank nochmal und viele Grüße

      Michael

      1. ein passwort wird nicht mit md5 erzeugt!
        es wird lediglich unleserlich gemacht! unleserlich=md5(klartext)
        das passwort erzeugst du! oder ein generator.
        du solltest dich vergewissern, was da wo erzeugt und übertragen wird. oder zur anmeldung benutzt wird.
        bei der anmeldung wird das passwort idr. im klartext eingegeben.
        ein md5 besteht aus einer 32 stelligen hex-darstellung, also zeichen von 0-9 und a-f. ein stern ist dort nicht dabei. dies bezieht sich sicherlich auf das passwort im klartext.

      2. Moin!

        Auffällig ist bei allen JSP-erzeugten Passwörtern, dass das erste Zeichen immer ein * ist.
        Hat das vielleicht was zu bedeuten?

        salt

        Lies in der Dokumentation der MD5-Funktion von Java/JSP nach.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
  2. Moin,

    Wird bei der Verwendung einer md5 Verschlüsselung ein Passwort von verschiedenen Anwendungen gleich erzeugt und somit das Gleiche in eine Datenbank geschrieben?

    Schreib bitte 100 mal an eine Tafel deiner Wahl: "MD5 ist _keine_ Verschlüsselung." MD5 ist ein Hash-Algorithmus, ein kryptographisch halbwegs sicherer noch dazu. (Bzw. im kryptographischen Sinne ist MD5 bereits gebrochen, das hat aber für deine Anwendung keine Auswirkungen.)

    Ich möchte mit einer PHP-Seite Zugangsdaten (Benutzername und Passwort(md5)) erstellen lassen. Damit soll ein Login zu einer anderen Anwendung auf meinem Server ermöglicht werden, die auf JSP und Java basiert. Das klappt leider nicht, da sich die PHP-md5 Passwörter von denen die via JSP-md5 erzeugt werden unterscheiden.

    Wenn man MD5 im Zusammenhang mit Passwörtern einsetzt, möchte man meist erreichen, dass das Passwort zwar leicht geprüft werden kann (MD5(Passwort) ist leicht berechenbar), aber aus den Informationen in der Passwortdatenbank keine Rückschlüsse auf das Passwort zu ziehen sind (eine Umkehrfunktion die zu gegebenem MD5(Passwort) das Passwort ausgibt ist nicht bekannt bzw. nicht einfach berechenbar). Zu diesem Zweck führt man häufig noch ein sogenanntes 'Salt' ein, das sprichwörtliche Salz in der Suppe.

    Da MD5 per definition für jedes Passwort ja den gleichen MD5-String erzeugt ergibt sich nämlich ein Problem: Was ist, wenn mehrere Benutzer das gleiche Passwort haben? Dann könnte man das in der Passwortdatenbank sehen, da sie auch den gleichen MD5-String hätten. Oder allgemeiner: Wenn man die Umkehrung von MD5 nicht berechnen kann, baut man sich halt einfach (naja) ein Wörterbuch in dem für die üblichen Passwörter (Liebe, Sex, Geheim und Gott, etc.) die entsprechenden MD5-Summen verzeichnet sind. Wenn man dann Zugriff (wie auch immer) auf die Passwortdatenbank hat, schaut man einfach in dieser Liste nach.

    Mit dem Salt verhindert man all dies, indem man zusätzlich zu dem eigentlichen Passwort noch einen zufälligen String mithasht (den muss man sich natürlich merken). Also anstatt MD5(Passwort) zu berechnen, berechnet man MD5(Salt + Passwort) und speichert das zusammen mit dem Salt.

    Ob und wie das relevant für dich ist, lässt sich mit den Informationen die du gegeben hast nicht entscheiden. Schlag entweder in der Dokumentation der Funktionen die du verwendet hast nach, da müsste das Salt erwähnt werden, wenn es verwendet wird, oder gib Codebeispiele.

    --
    Henryk Plötz
    Grüße aus Berlin
    ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
    ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
    1. das salt sollte aber für jeden benutzer verschieden sein, da sonst wiederum eine liste mit vorbereiteten passwörtern erzeugt werden kann, und ein test auf gleichheit möglich ist.
      ein benutzer wird sich dies aber nicht zusätzlich merken. eine zusätzliche funktionalität hierfür ins system einzubauen ist wohl auch unsinn.
      daher mache ich meine passwort-hashes mit einem einfachen dynamischen teil, z.b. den benutzernamen. also hash=md5(benutzerid+passwort).

  3. Hi Michael,

    Wird bei der Verwendung einer md5 Verschlüsselung ein Passwort von verschiedenen Anwendungen gleich erzeugt und somit das Gleiche in eine Datenbank geschrieben?

    Spontan würde ich sagen: Nein - es gibt allerdings verschiedene Möglichkeiten den erhaltenen Wert darzustellen! Die PHP Funktion md5() (Achtung, deutsches Manual ist hier mal wieder veraltet) gibt den erhaltenen Wert standardmäßig als eine hexadezimale Zahl aus, welche 32 Zeichen lang ist. Alternativ kann man den Wert auch noch im unbearbeiteten Binär-Format ausgeben lassen - der dann 16 Zeichen lange String kann allerdings nicht darstellbare Zeichen enthalten, weshalb auch PHP standardmäßig die Ausgabe als hexadezimale Zahl verwendet.

    Die siehst also, dass gleiche Ergebnis kann unterschiedlich dargestellt werden. Ab PHP5 kannst du über einen zweiten, optionalen Parameter von md5 das Ausgabe-Format kontrollieren:

    $hexadez_hash = md5($string);  
    $binary_hash = md5($string, true);
    

    Will man die Ausgabe im Binär-Format in einer PHP-Version kleiner 5 haben, so gibt es einen Trick, wie in Userkommentar zeigt:
    $binary_hash = pack('H*', md5($string));

    Lass dir also den Wert mal in beiden Ausgabe-Formaten anzeigen und vergleiche ihn dann nochmal mit den Werten, die dir andere Programmiersprachen ermitteln. Unabhängig davon, kann es natürlich auch (noch zusätzlich) sein, dass ein Salt-String verwendet wird.

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Die FlatBox 0.3 mit Dokumentation ist da!
    Man sollte nie aufhören zu fragen (Albert Einstein)
    ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P