Kathleen: MD5-Problem

Hallo alle zusammen,

hier ist mal wieder jemand, der ein Ver-(bzw. Ent)schlüsselungsproblem hat.

Ich habe eine Tabelle in meiner MySQL-Datenbank, in der ich die Nutzernamen und die mittels md5 verschlüsselten Kennwörter ablege. Dies sieht in meinem PHP-Skript so aus:

$sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', md5('$passwort'))";

Bis hierhin funktioniert auch alles. Aber wenn ich eine Abfrage starte, ob ein Benutzer mit jeweiligem Kennwort existiert, wird das Kennwort nicht erkannt.

$sqlq = "SELECT * FROM nutzerdaten WHERE nu_login = '".$benutzername."' and nu_password = '".md5('$passwort')."'";

In beiden Statements handelt es sich um die gleichen Nutzerdaten (der Benutzername wird übrigens gefunden).
Ist die Syntax vielleicht nicht ok ?

Für jegliche Hilfe wäre ich sehr dankbar

Gruss
Kathleen

  1. Hallo alle zusammen,

    Hallo Du eine!

    Hast Du Dir mal spaßeshalber $sqlq ausgeben lassen?

    md5('$passwort') verschlüsselt vermutlich '$passwort' statt das passwort :)

    fastix®

    1. Hi fastix®,

      Hast Du Dir mal spaßeshalber $sqlq ausgeben lassen?
      md5('$passwort') verschlüsselt vermutlich '$passwort' statt das passwort :)

      Du hast recht, es wird tatsächlich '$passwort' verschlüsselt.
      Allerdings findet diese (zwar unerwüschte) Verschlüsselung sowohl beim Reinschreiben, als auch beim Auslesen statt. Also müsste das Statement doch einen Treffer liefern, oder habe ich da einen Denkfehler?

      Abgesehen davon habe ich noch immer nicht herausgefunden, wie nun die korrekte Schreibweise aussieht.
      Mein neuester Geistesblitz sieht so aus:

      $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', md5('$passwort'))";
      ...
      $sqlq="SELECT * FROM nutzerdaten WHERE nu_login = '$benutzername' AND nu_password=md5('$passwort')";

      In der Datenbank kommt die Verschlüsselung an, aber die Abfrage leifert wieder 0 Datensätze. (langsam gehe ich die Wände hoch)
      Ich weiß absolut nicht mehr weiter.

      1. Mein neuester Geistesblitz sieht so aus:

        $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', md5('$passwort'))";
        ...
        $sqlq="SELECT * FROM nutzerdaten WHERE nu_login = '$benutzername' AND nu_password=md5('$passwort')";

        Hallo,

        Ich könnte mir vorstellen das die PHP-Funktion md5() innerhalb deines Querys Probleme macht. Ist IMHO jedenfalls nicht ganz sauber.

        Versuchs mal so:

        $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', " . md5('$passwort') . ")";

        besser ist es wahrscheinlich wenn du das verschlüsselten Passwort in eine Variable schreibst und dann in das Statement einbaust, etwa so:

        $md5 = md5("$passwort");

        $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', '$md5')";

        Gruss aus Heilbronn
        AndreD

        1. Hallo AndreD,
          »»Ist IMHO jedenfalls nicht ganz sauber.

          Was bedeutet IMHO?

          Versuchs mal so:

          $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', " . md5('$passwort') . ")";

          Funktioniert nicht, d.h die INSERT-Anweisung wird nicht ausgeführt.

          $md5 = md5("$passwort");

          $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', '$md5')";

          Genau das funktioniert!
          Wenn ich die Abfrage genauso gestalte, erhalte ich endlich ein positives Ergebnis.

          Auch Dir vielen, vielen Dank für die schnelle Antwort und noch einen schönen Abend.

          Gruss
          Kathleen

          1. Hallo,

            Was bedeutet IMHO?

            Ist so eine trad. Abk. im Web, bedeutet "In My Humble Opinion" auf deutsch etwa "Meiner Auffassung nach" oder so... Man könnte es ja auch deutsch abkürzen MAN aber als quasi inoffizieller Standard hat sich wohl IMHO durchgesetzt. Es gibt glaub ich auch noch nur IMO also ohne (H)umble.

            Auch Dir vielen, vielen Dank für die schnelle Antwort und noch einen schönen Abend.

            Danke, wenns Dir geholfen hat freut es mich. Für eine genauere Ausführung gibts da noch das Post von Sven Rautenberg.

            Gruss AndreD

      2. Hi fastix®,

        Hallo Kathleen!
        Es ist doch einfach :)

        $passwort="Es macht Spaß!"

        $passwort=md5($passwort);

        $sqlin = "INSERT INTO nutzerdaten (, nu_password) VALUES ('$benutzername', '$passwort'";

        $passwort=md5($passwort);

        $sqlq="SELECT nu_login, FROM nutzerdaten WHERE nu_login = '$benutzername' AND nu_password='$passwort'";

        1. Hallo Kathleen!

          Man sollte einfach nicht telefonieren und absenden drücken...

          Es ist doch einfach :)

          Beim Eintragen:

          $passwort=md5($passwort);
          $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', '$passwort'";

          Beim Abfragen:

          $passwort=md5($passwort]);
          $sqlq="SELECT nu_login, nu_password FROM nutzerdaten WHERE nu_login = '$benutzername' AND nu_password='$passwort'";

          Und scahu mal in die Datenbank, was drin steht und auch Deine SQL-Abfragen an. Immer...

          fastix®

          1. Hallo fastix®,

            Es ist doch einfach :)

            Klar, wenn man's weiss!

            Beim Eintragen:

            $passwort=md5($passwort);
            $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', '$passwort'";

            Beim Abfragen:

            $passwort=md5($passwort]);
            $sqlq="SELECT nu_login, nu_password FROM nutzerdaten WHERE nu_login = '$benutzername' AND nu_password='$passwort'";

            Juhu, es funktioniert!!!
            Allerding würde ich gern noch dahinter kommen, was an dem alten Code falsch war. Den habe ich mir nämlich aus einem anderen Forums-Beitrag (von MichaelS, 01. 01. 2003, 23:31 Uhr ff.) zusammengebastelt.
            Auf jeden Fall vielen, vielen Dank für die Hilfe.

            Schönen Abend noch
            Kathleen

            1. Moin!

              Allerding würde ich gern noch dahinter kommen, was an dem alten Code falsch war. Den habe ich mir nämlich aus einem anderen Forums-Beitrag (von MichaelS, 01. 01. 2003, 23:31 Uhr ff.) zusammengebastelt.

              [pref:t=46250&m=252458]

              - Sven Rautenberg

              --
              Signatur oder nicht Signatur - das ist hier die Frage!
  2. Moin!

    Du bastelst deine SQL-Strings unterschiedlich zusammen!

    $sqlin = "INSERT INTO nutzerdaten (nu_login, nu_password) VALUES ('$benutzername', md5('$passwort'))";
    $sqlq = "SELECT * FROM nutzerdaten WHERE nu_login = '".$benutzername."' and nu_password = '".md5('$passwort')."'";

    Der spannende Teil ist der mit md5.

    In $sqlin schreibst du als Feldinhalt
    md5('$passwort')
    in die Datenbank rein. Es wäre nachzuprüfen, ob das in einem String "md5('daswirklichepasswort')" oder in einem md5-codierten String endet - auch SQL kennt schließlich Funktionen. Ist tendiere zur zweiten Möglichkeit.

    In $sqlq aber wird das Passwordfeld tatsächlich aus der md5-Funktion von PHP gespeist. Allerdings wird als Argument immer der String '$passwort') verwendet. Die Ersetzung von $-Variablen in Strings funktioniert nur in doppelten Anführungszeichen! Und außerdem sind Anführungszeichen absolut überflüssig, wenn du eine String-Variable übergeben willst.

    Du hast also zwei unterschiedliche Methoden (eine davon sogar grob fehlerhaft), um ein md5-codiertes Passwort herzustellen. Daher ist die simple Lösung des Problems, einfach an beiden Stellen identisch vorzugehen!

    Entweder verwendest du die SQL-Funktion md5. Das macht die Sache eigentlich ziemlich einfach zu lesen:

    $sqlin = "INSERT ... VALUES ('$benutzername', md5('$passwort'))";
    $sqlq = "SELECT ............... nu_password = md5('$password')";

    Oder du benutzt die (korrigierte) Variante mit PHPs md5():

    $sqlin = "INSERT ... VALUES ('$benutzername', '".md5($passwort)."')";
    $sqlq = "SELECT ............... nu_password = '".md5($passwort)."'";

    Ich hab, um die Identität bei md5 zu verdeutlichen, die Strings mal passend eingerückt. Es ist grundsätzlich eine gute Idee, bei solchen Dingen Einheitlichkeit zu bewahren. md5 ist zwar ein standardisiertes Verfahren, aber das Ergebnis kann dann doch noch abweichen. Der Apache-Webserver z.B. erlaubt auch md5-codierte Passworte für .htaccess-Schutz. Die sehen aber absolut anders aus als das, was PHP mit md5() ausgibt - vermutlich binär identisch, aber in der Ausgabe anders codiert. Deshalb: md5() ist ein gutes Verfahren, es empfiehlt sich aber nicht, das zu mischen! Ansonsten treten unvorhersehbare Probleme auf.

    - Sven Rautenberg

    --
    Signatur oder nicht Signatur - das ist hier die Frage!