Marc: Passwortverschlüsslung

Servus Leutz,

kann mir einer erstmal die Unterschiede zwischen den typischen MySQL Funktionen Password, MD5 und Encrypt erleutern?

Mein Problem:
Habe in einem Script das verschlüsselte Passwort in einer Datenbank. Dies möchte ich nun auslesen und mit dem überprüfen, welches der Kunde im Formular angegeben hat. Kann dies so funktioneren?

if ($veschlusseltes-pw-aus-datenbank!=$_POST[FORMULAR_PW]) {
Falsches Passwort
}
else {
Passwort korrekt
}

  1. kann mir einer erstmal die Unterschiede zwischen den typischen MySQL Funktionen Password, MD5 und Encrypt erleutern?

    Grundsätzlich: Es gibt zwei Gruppen von "Verschlüsselungen": echte Verschlüsselung und Prüfsummenberechnung. Die beiden unterscheiden sich dadurch, daß eine echte Verschlüsselung wieder entschlüsselt werden kann, eine Prüfsumme hingegen niemals.
    Prüfsummenfunktionen kannst Du in Anleitungen immer daran erkennen, daß es zwar eine "Verschlüsselungsfunktion" gibt (PASSWORD(), MD5()), aber keine Entschlüsselungsfunktion. Hast Du eine halbe Minute mehr Zeit, wirst Du dort eventuell auch auf den Text "PASSWORD() encryption is non-reversible." stoßen.

    PASSWORD() und MD5() stehen sich wahrscheinlich gegenseitig nichts nach. Vielleicht ist der einzige Unterschied, daß PASSWORD() eher da war (die Funktion wird für die MySQL-eigene Zugangsverwaltung benutzt), MD5() hingegen ein Algorythmus mit einem breiten Anwendungsspektrum ist (ich sag nur MP3), den eine Datenbank "haben muss".

    ENCRYPT() bedient sich einer Funktion des Betriebssystems. Generell ist davon abzuraten, weil sie in manchen Fällen nur die ersten acht Zeichen beachtet - das grenzt die Passwortwahl schon sehr ein.

    Habe in einem Script das verschlüsselte Passwort in einer Datenbank. Dies möchte ich nun auslesen und mit dem überprüfen, welches der Kunde im Formular angegeben hat. Kann dies so funktioneren?

    if ($veschlusseltes-pw-aus-datenbank!=$_POST[FORMULAR_PW]) {

    Nein. Du mußt das Passwort aus dem Formular erst selbst verschlüsseln und das Ergebnis daraus mit dem gespeicherten, verschlüsselten Passwort vergleichen. Etwa so:

    $dbr=mysql_query("select nutzername from nutzer where passwort=MD5("".mysql_escape_string($_POST["formular"]."")");
      if ($dbr && (mysql_num_rows($dbr)==1))
         echo "Passwort richtig";
       else
         echo "Passwort falsch oder Datenbankfehler.";

    Gleiche Passworte ergeben die gleiche Prüfsumme, daher kann man die Prüfsummen auch miteinander vergleichen. Was Du hingegen nicht vergleichen kannst, sind die Passworte selber, denn wie Du ja jetzt weißt, lässt sich aus einer Prüfsumme nicht mehr auf die Quelldaten schließen.

    Die Funktion mysql_escape_string() dient lediglich dazu, Anführungszeichen im Formularpasswort zu maskieren. Andernfalls könnte man Deine Passwortprüfung durch Angabe des "Passwortes"

    ") or (""="

    leicht umgehen.

    Gruß,
      soenk.e

  2. md5: Verschlüsselt die Zeichenkette nach dem MD5-Verfahren. Dabei ist die zeichenkette nicht mehr zu entschlüsseln. Dies wird verwendet, um Sessions zu erzeugen (Ab PHP Version 4 gibt es Sessions-Funktionen)

    Kann dir diese empfehlen.

    Ein Encrypt habe ich nie gehört. Meinste vielleicht mcrypt_encrypt?
    http://www.php.net/manual/de/function.mcrypt-encrypt.php

    Also ein verschlüsseltes Passwort auszulesen und vergleichen hmmmm... wieso wird er denn verschlüsselt gespeichert? Einfach normal speichern, dann gehts auch so mit deiner If-schleide

    md5 würdest du dann nutzen um ein Cookie mit dem Passwort nun verschlüsselt zu erzeugen. Also so in der Art:

    $passwort = md5($passwort);

    setcookie("blabla",$passwort);
      header("Location: seite.php");

    1. Also ein verschlüsseltes Passwort auszulesen und vergleichen hmmmm... wieso wird er denn verschlüsselt gespeichert?

      Dir ist schon bekannt, daß fast sämtliche Daten, die auf einem Webserver gespeichert werden, zumindest von allen anderen Nutzern des Webservers eingesehen werden können, bei dusseligem Aufbau auch von der ganzen Welt? Und nein, der PHP-Safemode hilft Dir absolut gar nichts, sobald CGI freigegeben ist.

      Das unverschlüsselte Speichern von Passwörtern ist grober Unfug, gemeingefährlich und sollte tunlichst unterlassen werden.

      Gruß,
        soenk.e