Hi!
Aus gegebenem Anlass möchte ich euch etwas Kryptographie näher bringen.
Man sieht in diversen Tutorials, dass empfohlen wird, Passwörter mit MD5 zu "verschlüsseln". Jedes Mal, wenn ich das lese, kann ich nur meinen Kopf schütteln:
MD5 ist keine Verschklüsselung. MD5 ist ein Hash-Verfahren - und Hashverfahren zielen auf andere Ziele ab, als Passwörter zu verschlüsseln, sondern für digitale Signaturen. Das sieht man auch an dem Fakt, dass jede Verschlüsselung eigentlich einen Schlüssel benötigt.
Dementsprechend schlecht "verschlüsselt" man mit MD5 auch. MD5 kann von diversen kostenlosen Programme innerhalb von ein paar Stunden geknackt werden. Wenn man mathematisch an die Sache rangeht, wird es sogar noch leichter.
Zitat von Klaus Schmeh, einem renommierten Kryptographen und Autor: "Inzwischen ist es sogar möglich, Kollisionen auf einem gewöhnlichen PC innerhalb von Stunden zu berechnen [Klima]. MD5 ist damit endgültig tot." (Kryptographie, dpunkt.verlag, Seite 224)
Deshalb möchte ich euch ein anderes Verfahren zur Verschlüsselung wichtiger Daten vorstellen: RSA. RSA ist ein asymmetrisches Verfahren, das von Ron Rivest, Adi Shamir und Leonard Adleman entwickelt wurde. Dieses Verfahren besitzt zwei Schlüssel: Einen öffentlichen und einen privaten. Alles, was der öffentliche Schlüssel verschlüsselt, kann der private entschlüsseln - und umgekehrt.
RSA gilt nach heutigem Wissensstand als praktisch unknackbar - jedenfalls ohne Real World Angriffe.
Anbei findet ihr ein Script, das sowohl die RSA-Schlüssel berechnen, als auch die Verschlüsselung durchführen kann. Dieses Script benötigt eine aktivierte BC Math Library.
Außerdem beherrscht das Script auf die AES-Verschlüsselung (Advanced Encryption Standard) - ein Verfahren, das von diversen US-amerikanischen Ministerien zur Verschlüsselung von Top-Secret-Dokumenten vorgeschrieben wird.
Die Idee hinter der RSA-Passwort-Verschlüsselung ist, dass der öffentliche Schlüssel zur Verschlüsselung verwendet wird - der private könnte dies wieder entschlüsseln. Wenn jedoch der private Schlüssel nicht abgespeichert wird, existiert keine Möglichkeit mehr, das Passwort zu entschlüsseln. Wird der öffentliche Schlüssel gespeichert, kann nur VERschlüsselt werden.
Das angehängte Archiv enthält noch diverse große Primzahlen, die zur Schlüsselberechnung verwendet werden. Diese Liste kann beliebig erweitert werden.
Anwendung
Die Klasse RSA_Handler enthält die Funktion get_random_key(). Diese gibt einen Array zurück, das alle wichtigen Werte für den Schlüssel beinhält: Die Zahlen N, D und E.
Der private Schlüssel besteht aus N und D.
Der öffentliche Schlüssel besteht aus N und E.
Aus N und E ist nach heutigem Stand der Technik D nicht zu berechnen.
Wenn nun eine Verschlüsselung stattfinden soll, muss die Methode encrypt() übergeben werden. Die Parameter der Funktion sind:
$m ... Der Text
$e ... Öffentlicher Schlüssel - E
$n ... Öffentlicher Schlüssel - N
Die ausgegebene Zeichenkette ist der Geheimtext - der verschlüsselte Text.
Wenn nun der Geheimtext, N und E gespeichert werden, kann jederzeit das Passwort überprüft werden. Es kann aber nicht wiederhergestellt werden, solange die Zahl D nicht gespeichert wird.
Liebe Grüße
Dodo