Kryptokiddies

Nachdem die Wortschöpfung „Skriptkiddie“ mittlerweile schon in verschiedenen Lexika zu finden ist, möchte ich euch an dieser Stelle ein neues Volk vorstellen, welches unmittelbar davon abzustammen scheint: der Kryptokiddie.

Nachdem ich mich im Internet ein wenig über Kryptoimplementierungen informiert hatte, fand ich nach kurzer Zeit folgende PHP Implementierung des asymmetrischen Verschlüsselungsverfahren RSA:

http://scripts.ringsworld.com/development-tools/rsa1.3/rsa.php.html

Bevor ich nun erkläre warum der Code wirklich wertlos ist, einige Worte zu dem Verfahren selbst. Dies beruht darauf, das zwei große Primzahlen miteinander multipliziert werden. Diese ergeben das RSA Modul m. Mit Hilfe dieser Primzahlen (unter Verwendung der Eulerschen Phi Funktion) wird ein öffentlicher Schlüssel e und ein privater d ausgerechnet. Bei der Verschlüsselung wird einfach nur der Klartext p mit dem öffentlichen Schlüssel e exponenziert, also c = p^e mod m ausgerechnet. Zur Entschlüsselung passiert das selbe mit dem Chiffretext c und dem privaten Schlüssel d und ergibt sich zu p‘ = c^d mod m. Falls alles korrekt ist, entspricht p=p‘.

Wem das nun zu schnell ging: bei diesem Verfahren gibt es 2 Schlüssel, einen öffentlichen und einen privaten. Mit dem öffentlichen lässt sich lediglich ver- und mit dem privaten entschlüsseln. Will man nun jemandem eine Nachricht schicken, wird der Text mit dem öffentlichen Schlüssel (des Empfängers) verschlüsselt und da nur er den privaten besitzt, kann auch nur dieser den Text wieder entschlüsseln.

Mit dem Zeitalter der asymmetrischen Verschlüsselungsverfahren ist die Zeit des „Schlüssel im Aktenkoffer mit Handschellen übergeben“ vorbei und überflüssig geworden.

Das ganze funktioniert jedoch nur praktisch sicher, wenn das o.g. RSA Modul (also das Produkt der 2 Primzahlen) groß genug gewählt wurde. Groß bedeutet bei dem heutigen Stand der Technik: 1024 – 2048 Bit. Im Privatgebrauch sind 1024 völlig ausreichend, Banken und Zertifizierungsstellen verwenden 2048. In unserem Implementierungsbeispiel werden jenoch nur zwei 13 Bit Primzahlen multipliziert was sich zu einem 26 Bit RSA Modul ergibt.

Die Faktorisierung (also das zurückrechnen von einem Modul zu 2 Primzahlen) benötigt ca. 1 Sekunde. Also nach einer ganzen Sekunde sind die zwei Primzahlen und der private Schlüssel ausgerechnet. Es macht mir wirklich Angst, das es vielleicht Leute gibt die diesen Quelltext einsetzen.

Was lernen wir daraus:

  • wenn bei einer RSA Implementierung ein Array mit Zahlen zu sehen ist: skeptisch sein
  • wenn die Zahlen auch noch vom Typ Integer sind: Alarm!
  • wenn lediglich aus diesen Zahlen das Modul gebastelt wird: HÄNDE WEG!!!

Ich danke für die Aufmerksamkeit bei meinem zweiten konstruktiven Blogeintrag.

Hacken für Anfänger

Weisst du was MD5 ist? MD5 ist toll! MD5 ist sogar so toll, das es jeder benutzt. Warum auch nicht, in PHP ist es einfach nur simpel

$hash = md5(„Hallo“);

und das war`s schon. Für alle die denken dies wäre vielleicht ein Modell einer Automarke des Fernen Ostens: MD5 (Message-Digest Algorithm 5) ist eine kryptografisch nicht ganz sichere, praktisch jedoch immer noch ausreichende Hashfunktion. Diese ist dazu da, eine Zeichenkette beliebiger länge durch „wenige“ Bits ( 128 ) zusammenzufassen. Es ist also eine Art Fingerabdruck. Ein Merkmal von Hashfunktionen ist, das selbige nicht zurückgerechnet werden kann. Sei also M und M‘ jeweils unterschiedliche Strings, soll es nicht möglich sein folgendes zu finden:

Hash(M) = Hash(M‘)

man spricht auch von Kollisionsfreiheit.

Soviel zu den Grundlagen. In der Praxis werden Hashfunktionen hauptsächlich für MACs (Message Authentication Codes) verwendet. Das ist aber nicht alles, denn in den meisten Fällen werden damit Passwörter in einer Datenbank gespeichert. Die Idee ist, das falls die Datenbank mal „gehackt“ wird (z.B. SQL-Injection), der Bösewicht keine Informationen über das verwendete Passwort bekommt. Häufig ist es so, das Anwender das gleiche Passwort mehrfach verwenden, also auch für den E-Mail Account. Und damit ergeben sich ungeahnt viele Möglichkeiten.

Die Idee ist super, also ein unleserliches Passwort auf der einen Seite und trotzdem volle Funktionalität. Wo ist also jetzt der Haken? Das ist recht einfach, denn für die meisten kleinen Passwörter wurde das MD5 schon „durchgerechnet“. D.h. in einer großen Datenbanken stehen jeweils Klartext und Hashwert. Das trägt den schönen Namen „Rainbow Table“ und ist recht bekannt. Dadurch ergibt sich ja aber immer noch kein Sicherheitsproblem, denken Sie nun. Denn immerhin muss der Angreifer erstmal an diesen Hashwert kommen. Das stimmt jedoch nur halb, denn Google hilft!

Wenn ich „abc123“, als schlechtes aber häufig verwendetes Passwort hashen lasse, erhalte ich „e99a18c428cb38d5f260853678922e03“. Dies gebe ich einfach mal in Google ein. Nicht sehr viel später finde ich (bedingt durch die Einzigartigkeit) verschiedene Sicherheitslücken in Webanwendungen.

An dieser Stelle nehme ich natürlich abstand Beispiele zu nennen. Ungelogen hat es jedoch nicht lange gedauert bis ich eine Art Interface gefunden hatte, auf welcher mehrere Benutzer und dessen Passwort (in MD5) aufgelistet waren.

Wie geht es besser? Es sollte, bei dem Einsatz von MD5, immer eine Art Padding oder geheimen Schlüssel verwendet werden. Beispiel:

$hash = md5($passwort . „DiesIstEinGeheimerSchluessel“);

Dieser kann dann in die Datenbank geschrieben werden. Falls nun mal was passiert, sollte der Angreifer wenigstens in keiner Rainbowtable fündig werden. Moderne Hashverfahren bieten diese Funktionalität (das angeben eines Schlüssels) automatisch, aber auch mit MD5 lässt sich unter diesen Voraussetzungen arbeiten.

Ich danke für die Aufmerksamkeit bei meinem ersten konstruktiven Blogeintrag.

Willkommen

Herzlich Willkommen auf diesem neu erstellten Blog zum Thema IT-Sicherheit und angewandte Kryptographie.

Dieser Eintrag ist als Test und Startsignal anzusehen, ich denke das es sich lohnen wird von Zeit zu Zeit hier herein zu schauen.