Dann "rechtfertige" ich mal.
Die Antworten hier habe ich übrigens erwartet, zeigen mir aber auch, dass das Thema nicht generell zuende gedacht wird/wurde.
Was soll den mit einer Verschlüsselung erreicht werden?
Zunächst soll ein "Text" erst einmal unkenntlich gemacht werden, damit man den "Klartext" nicht offensichtlich vor Augen hat. Er muss ein One-Way-Ticket sein, sprich man darf den String/Text nicht wieder entschlüsseln können (sofern der Verschlüsselungsalgorithmus auch funktioniert). Er muss reproduzierbar sein (der selbe Text muss den selben Hash produzieren), sonst lassen sich Passwort-hashes nicht miteinander vergleichen. Und genau DORT liegt die grosse Unsicherheit.
3 Stellige Passwörter generieren zu lassen ist kein Aufwand für Rechner und NICHT die Verschlüsselung selbst ist hier das Problem, sonderen die verfügbare Rechenleistung die diese Aufgabe in wenigen Sekunden erledigen kann.
Rainbow-Table setzt zunächst voraus, dass ich irgend wie an den Hash komme, was für sich genommen schon fast einem geknackten Passwort (Code) gleich kommt. Erste Voraussetzung für ein sicheres Passwort ist also, den Hash nicht bekannt zu geben!
Zitat
.......aber letzteres ist um ein Vielfaches kollisionsresistenter. D.h.,
Etwas, was ich in meinem obigen Post übrigens mit der Kombination von ID+Username+Passwort ebenfalls ähnlich realisiert hätte und darauf habe ich extra hingewiesen. Die Kombination aus MD5(ID+Passwort) setzt auch Rainbowtabellen ausser Kraft und hat zudem noch den Vorteil, dass ein User, der sich z.B. in mehreren Foren mit dem selben Passwort anmeldet verschiedene MD5-Hashes zugewiesen bekommt (das klappt natürlich auch mit allen anderen Verschlüsselungen, aber darum geht es ja eigentlich nicht).
Zitat
Regel 1) Je öfter etwas den Algorithmus durchläuft, desto sicherer wird es
....
Durch ein häufigeres Durchlaufen des Verschlüsselungsalgorithmus kommt aber mehr Chaos, mehr "Zufall" in den Hash
....
Hier wird schon implizit angenommen, dass der Hash nach aussen dringt. Man verlässt sich darauf, dass die Unlesbarkeit ein sicherheitsrelevantes feature ist. Ist es aber nicht. Kleines Beispiel:
$string = "a";
$MD5_zufallsprefix = 'cce0035';
echo "<pre>";
echo 'Standard MD5: ' . md5($string) . "\n";
echo 'Doppelt MD5 : ' . md5(md5($string)) . "\n";
// Rainbowtable killen
echo 'MD5 + Prefix: ' . $MD5_zufallsprefix.substr(md5($string),strlen($MD5_zufallsprefix),strlen(md5($string))) . "\n";
echo 'Standard DES: ' . crypt($string, 'rl') . "\n";
echo 'Extended DES: ' . crypt($string, '_J9..rasm') . "\n";
echo 'SHA-256 : ' . crypt($string, '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
echo 'SHA-512 : ' . crypt($string, '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
echo "</pre>";
Alles anzeigen
Ergebnis:
Standard MD5: 0cc175b9c0f1b6a831c399e269772661
Doppelt MD5 : d7afde3e7059cd0a0fe09eec4b0008cd
MD5 + Prefix: cce00359c0f1b6a831c399e269772661
Standard DES: rlm7yWjICSgV.
Extended DES: _J9..rasmWuvos8B/9gQ
SHA-256 : $5$rounds=5000$usesomesillystri$CV9NHgkKMD/0AlV.nDuk.R1O2LWDpPQh0nnvMwUoNG0
SHA-512 : $6$rounds=5000$usesomesillystri$EgFOhWMt0i19wAdCx0mX7vXrnzkh1u.78VGGmXxjMOtkA/TQjHF88ANJB4BaDpw.pjHOpKQXO0FGBSgK5rtk31
Ich behaupte mal, aus keinem der oben generierten Hashes kannst du das Passwort "a" herausraten. Setzt du ein Wörterbuch oder ein kleines Script darauf an, ist das Passwort in weinigen Sekunden geknackt und der doppelte MD5-Hash hat keinerlei Sicherheitswirkung. Obige Aufgabe lässt sich sogar händisch problemlos lösen.
Der wesentlichste Schritt zur Sicherheit ist ein Passwort aus (was weiss ich) mindestens 8 Zeichen, mit Gross/Kleinschreibung, Zahlen und Sonderzeichen. Ein Script tut sich hier auch schon um einiges schwerer. Wie lange ein Script für 8 oder mehr Zeichen brauchen würde weiss ich nicht, aber auch hier gillt, liegt der Hash als Vergleich vor mir, habe ich die halbe Miete schon verschossen.
Lasse ich beliebig viele Eingabeversuche zu, gillt:
Das Passwort "!Grf5mn&" ist bei ordentlicher Programmierung nahezu gleich sicher als MD5-Hash wie auch als SHA-256 oder SHA-512.
Was ich übrigens noch zusätzlich einbaue ist eine MUSS-Pause von 3 Sekunden zwischen 2 Passwort-Eingaben, was einen Robot-Einsatz zu einer langweiligen Sache macht.
Ich formuliere es mal so:
Was mich an obigem Text gestört hat, ist die Tatsache, dass der Eindruck entsteht, man kann mit einer entsprechenden Verschlüsselung ruhig das Passwort "abc" verwenden, es ist sicher, man nutzt ja eine sichere Verschlüsselung. Wesentlich ist aber das Passwort selbst, dass das Passwort (der Hash) nie nach aussen dringt und ein entsprechend sicheres Passwort gesetzt wurde. Mit einer Limitierung der Eingabe sind Unterschiede in der Sicherheit gegen NULL-laufend.
Ein Thema übrigens, dass auch in anderen Foren sehr kontrovers diskutiert wird.