Moin!
Ein Nutzer registriert sich. Das Passwort speicherst du verschlüsselt in der DB, verschlüsseln geht z.b. per MD5: http://de.php.net/manual/en/function.md5.php
ganz einfach $pass=md5($_POST[pass]);
und dann gleich nochmal:
$pass=md5($pass);
Was vollkommener Schwachsinn ist!
Grund:
Nehmen wir als Beispiel das Passwort "test".
Das ist erstens zu kurz, um sicher zu sein, und außerdem noch durch Wörterbuchattacken erratbar. Dagegen sichert man sich, indem man im Passwort eine Mindestlänge fordert, und neben kleinen Buchstaben auch noch große Buchstaben, Zahlen oder Sonderzeichen.
Verschlüsselt ergibt dies "098f6bcd4621d373cade4e832627b4f6"
(kannste z.b. unter http://scriptserver.mainframe8.com/md5.php machen oder halt selbst n php script schreiben)
Das lässt sich relativ leicht per BruteForce knacken.
Das läßt sich nur deswegen per Brutforce knacken, weil du ein so schlechtes Passwort erlaubt hast.
Hierbei werden z.B. alle Kombinationen mit 1-4 Buchstaben mit MD5 verschlüsselt und anschließend mit dem verschlüsselten Passwort, also "098f6bcd4621d373cade4e832627b4f6", verglichen (wie gesagt, md5 ist one way, d.h. lässt sich nicht einfach umkehren). aufgrund der (für einen modernen PC) geringen menge an kombinationen ist sowas innerhalb 1,2 minuten erledigt.
Du hast keine Ahnung, von was du sprichst, oder?
Gewiß ist es recht simpel, einfach bei "aaaa" anzufangen, alle daraus resultierenden MD5-Strings zu erzeugen, und abzuwarten, bis der gewünschte String rauskommt.
Aber genauso einfach ist es, einfach das vier Zeichen lange Passwort als Loginversuch zu verwenden - das Loginsystem wird sich schon melden, wenn es das Passwort als korrekt erkannt hat.
wäre nun jedoch das Passwort "test" 2mal verschlüsselt, d.h.
- md5("test") --> 098f6bcd4621d373cade4e832627b4f6
- md5("098f6bcd4621d373cade4e832627b4f6") --> fb469d7ef430b0baf0cab6c436e70375
Das Passwort doppelt durch MD5 zu jagen bringt gar nichts. Denn du kannst weiterhin diese vier Zeichen als Passwort im Login eingeben - und das ist weiterhin recht schnell herausgefunden.
Umgekehrt bringt es dir recht wenig, wenn du den 32-Zeichen-Hex-String nochmal durch MD5 jagst, weil du pro Zeichen nur 16 verschiedene Möglichkeiten hast - die Auswahlmenge ist im Vergleich zu einem echten 32-Zeichen-String mit allen möglichen Zeichen deutlich kleiner.
Wenn du also monierst, dass das Passwort zu kurz ist, mußt du auch monieren, dass die Zeichenauswahl eines MD5-Strings zu klein ist, um wirkliche Sicherheit zu produzieren.
Im Gegenteil reduziert deine Vorgehensweise sogar die Sicherheit bei den Passworten, die durch ihre Länge und Zeichenwahl deutlich sicherer sind, weil sie mehr als 2^128 verschiedene Kombinationen enthalten können.
Wollte man dieses zweimal verschlüsselte Passwort knacken, müsste man alle Kombinationen von 1-32 zeichen ausprobieren - und das sind wesentlich mehr als bei 1-4 zeichen. und dann hätte man auch erst "098f6bcd4621d373cade4e832627b4f6", also das einmal verschlüsselte passwort "test", das man dann wiederrum knacken müsste (das geht nun schnell, aber ist ja nur n beispiel und n passwort mit 32 zeichen zu knacken dürfte jahre dauern, gibt genug tools dafür, kannst es ja mal selbst testen).
Du behauptest hier Dinge, ohne den Beweis anzutreten. Deshalb widerspreche ich deiner Darstellung einfach mal.
Es ist für das Speichern eines Passwortes absolut irrelevant, ob das im Klartext, mit MD5, mit SHA1, mit doppeltem MD5 oder ROT13 passiert. Entscheidend für die Sicherheit ist, dass das Passwort vom User selbstverständlich immer im Klartext eingegeben wird, der Prüfmechanismus kann also so komplizierte und lange Strings produzieren, wie er will - das hindert einen Angreifer nicht, zu kurze Klartextpassworte durch Ausprobieren im Login herauszufinden.
wie du evtl. bemerkt hast, beziehe ich mich hier auf angriffe direkt auf den inhalt einer datenbank. beim login musst du natürlich das eingegebene ebenfalls zweimal verschlüssen und mit dem inhalt der datenbank vergleichen, hier müsste ein angreifer dann nur 1-4 zeichen ausprobieren - allerdings übers netz, was bekanntlich wesentlich länger dauert, und du könntest eine ip ja nach z.b. 3 falschen eingaben blocken, sprich praktisch ist sowas nicht rentabel.
Es ist für einen Angreifer, der in einer Datenbank MD5 als Passwort vorfindet, praktisch unmöglich, daraus wieder die Originalen Passworte herzustellen. Da würde man extrem viel Rechenzeit sinnlos drauf verschwenden, ohne wirklich Erfolge zu haben. Mit Zufallstreffern kann es dabei immer sein, dass ein längeres Passwort zufällig genau den identischen MD5-Wert liefert, wie ein Passwort mit nur genau einem Zeichen, was natürlich sehr schnell gefunden wäre.
Außerdem wäre noch zu klären, wie der Angreifer denn an den Passwort-Hash kommen kann. Was sagt so ein Vorfall über die Sicherheit?
hört sich übrigens alles etwas kompliziertes an als es ist, das verschlüsseln des passworts ist absolut kein aufwand, bringt aber sicherheitsmäßig einiges.
Das verschlüsselte Ablegen des Passwortes bringt sicherheitsmäßig nach außen relativ wenig. Es hilft, gegen befugte Augen die Passworte zu verschleiern (wer als Admin weiteren Adminkräften nicht traut) - es ändert nichts an der Möglichkeit, von außen über den regulären Login-Mechanismus zu bruteforcen. Und es ändert nichts an der Tatsache, dass die Passworte letztendlich doch per Klartext zur Prüfroutine gelangen müssen, und an dieser Stelle abfangbar sind. Man könnte also, wenn man wollte, einfach an dieser Stelle die Accountdaten anzapfen, ohne sich auch nur einen Deut um doppeltes, dreifaches oder tausendfaches MD5 zu scheren.
- Sven Rautenberg
"Love your nation - respect the others."