Sönke Tesch: Passwortverschlüsslung

Beitrag lesen

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