Message-Digest Algorithm 5

Message-Digest Algorithm 5

Message-Digest Algorithm 5 (MD5) ist eine weit verbreitete kryptographische Hashfunktion, die aus einer beliebigen Nachricht einen 128-Bit-Hashwert (deutsch: Prüfsumme) erzeugt. MD5 wurde 1991 von Ronald L. Rivest entwickelt. Sie gilt inzwischen nicht mehr als sicher, da es mit überschaubarem Aufwand möglich ist, unterschiedliche Nachrichten zu erzeugen, die dieselbe MD5-Prüfsumme aufweisen.

Inhaltsverzeichnis

Geschichte

MD5 ist ein Vertreter aus einer Reihe von (kryptologischen) Hashfunktionen, die von Ronald L. Rivest am Massachusetts Institute of Technology entwickelt wurden. Als Analysen ergaben, dass der Vorgänger MD4 wahrscheinlich unsicher ist, wurde MD5 1991 als sicherer Ersatz entwickelt.

Bereits 1996 meldete Hans Dobbertin, dass er eine Kollision in MD5 gefunden hatte: zwei speziell präparierte Nachrichten, die sich unterscheiden, aber dennoch denselben Hashwert ergeben. Dieses war allerdings ohne praktische Auswirkungen auf die Sicherheit von MD5, denn die beiden kollidierenden Nachrichten ergaben keinen Sinn. Zudem enthielt der Angriff keine Anleitung, wie sich weitere Kollisionen erzeugen lassen. Dennoch empfahlen Kryptographen bereits damals, wenn möglich, auf sicherere Algorithmen umzusteigen. Der damals empfohlene SHA-1-Algorithmus zeigt inzwischen aber ebenfalls Schwächen. Besser ist nach aktuellem Stand der Forschung SHA-256.

Im nächsten Schritt gelang es Kryptoanalytikern, Kollisionen systematisch zu erzeugen, wenn der Anfang der Nachricht beliebig, aber fest vorgegeben ist. Zu diesem Anfang der Nachricht können mit vertretbarem Aufwand zwei verschiedene Fortsetzungen der Nachricht errechnet werden, die zum selben Hash-Wert führen. Diese Kollision bleibt auch erhalten, wenn an beide Nachrichten (jeweils bestehend aus dem gleichen Anfang und der einen bzw. der anderen Fortsetzung) das gleiche Suffix angehängt wird.

Schließlich gelang es 2004 chinesischen Forschern, Kollisionen auch für unterschiedliche Anfangs-Strings zu erzwingen. Dieser Angriff wurde von Wissenschaftlern so weit verfeinert, dass es diesen 2008 gelang, ein vertrauenswürdiges CA-Zertifikat ausstellen zu lassen. Mit diesem waren sie prinzipiell in der Lage, für jede beliebige URL ein SSL-Zertifikat zu fälschen und damit die vorherrschende Verschlüsselung im Web auszuhebeln. Die Arbeit wurde erstmalig im Dezember 2008 auf dem 25. Chaos Communication Congress vorgestellt. Einige Monate später wurde der vollständige Artikel veröffentlicht.[1] Zur Kollisionsberechnung benutzten sie einen Cluster von 200 Sony PlayStation 3. Weitere Details der Arbeit deuten an, dass der Aufwand seitdem gesunken ist.

Preimage-Angriffe können auch mit den genannten Methoden noch nicht in sinnvoller Zeit durchgeführt werden. Dadurch ist es weiterhin unmöglich, nachträglich ein gefälschtes Dokument zu erstellen, das zu einem bestimmten, mit MD5 erzeugten Zertifikat passt.

Es ist aber dank der Kollisionsangriffe in vielen Fällen möglich, zwei Dokumente zu erstellen, die den gleichen MD5-Hash ergeben, dann das erste, legitime Dokument signieren zu lassen, und anschließend dieses durch das zweite, gefälschte Dokument auszutauschen. Vor diesem Hintergrund ist von einer Weiterverwendung von MD5 abzuraten.

MD5-Hashes

Die 128 Bit langen MD5-Hashes (englisch auch „message-digests“) werden normalerweise als 32-stellige Hexadezimalzahl notiert. Folgendes Beispiel zeigt eine 59 Byte lange ASCII-Eingabe und den zugehörigen MD5-Hash:

md5("Franz jagt im komplett verwahrlosten Taxi quer durch Bayern") =
a3cca2b2aa1e3b5b3b5aad99a8529074

Eine kleine Änderung des Textes erzeugt mit sehr großer Wahrscheinlichkeit einen komplett anderen Hash. Mit Frank statt Franz (nur ein Buchstabe verändert) ergibt sich:

md5("Frank jagt im komplett verwahrlosten Taxi quer durch Bayern") =
7e716d0e702df0505fc72e2b89467910

Der Hash einer Zeichenfolge der Länge null ist:

md5("") = d41d8cd98f00b204e9800998ecf8427e

Verwendung und Verfügbarkeit

Unter den meisten Linux-Distributionen wird das Programm md5sum als Bestandteil der coreutils standardmäßig installiert.

Auf BSD-abgeleiteten Betriebssystemen wie Mac OS X gibt es das Kommando md5.

Auf vielen anderen Unix-Derivaten kann man sich mit dem meist installierten Programm OpenSSL behelfen.

Microsoft-Windows-Betriebssysteme verfügen ab Werk nicht über ein Programm zur Berechnung von MD5-Hashes, jedoch sind hierzu Programme von Dritten verfügbar, einige davon frei. Ein Beispiel, welches sich anbietet, besonders hervorgehoben zu werden, ist HashCheck Shell Extension[2], da es sich als Erweiterung der Shell nahtlos in das Kontextmenü des Windows-Explorers einbettet und somit nachträglich die Funktionalität zur Berechnung von MD5-Hashes in das Betriebssystem integriert.

Windows-Entwicklern bietet die .NET-Plattform vorgebaute MD5-Algorithmen im System.Security.Cryptography-Namensraum.[3] Des Weiteren exportieren cryptdll.dll und advapi32.dll zwei APIs für die MD5-Berechnung.

Überprüfung der MD5-Summe

Nach erfolgreichem Download einer Datei oder eines Ordners mit Dateien wird in der Regel in einer weiteren Datei die MD5-Summe mitgeteilt. Über ein Prüfsummen-Programm kann dann erneut die Prüfsumme aus der heruntergeladenen Datei berechnet werden, welche mit der mitgeteilten MD5-Summe verglichen wird. Sind beide MD5-Summen identisch, ist die Integrität der heruntergeladenen Datei bestätigt. Demnach traten beim Download der Datei keine Fehler auf.

Algorithmus

Eine MD5-Operation. MD5 besteht aus 64 Operationen dieses Typs, gruppiert in 4 Durchläufen mit jeweils 16 Operationen. F ist eine nichtlineare Funktion, die im jeweiligen Durchlauf eingesetzt wird. Mi bezeichnet einen 32-Bit-Block des Eingabestroms und Ki eine für jede Operation unterschiedliche 32-Bit-Konstante; left shifts bezeichnet die bitweise Linksrotation um s Stellen, wobei s für jede Operation variiert. Addition bezeichnet die Addition modulo 232.

MD5 erzeugt aus einer Nachricht variabler Länge eine Ausgabe fester Länge (128 Bit). Zuerst wird eine Eins an die Ausgangsnachricht angehängt. Danach wird die Ausgangsnachricht mit Nullen so aufgefüllt, dass ihre Länge 64 Bits davon entfernt ist, durch 512 teilbar zu sein. Nun wird eine 64-Bit-Zahl, die die Länge der Ausgangsnachricht codiert, angehängt. Die Nachrichtenlänge ist jetzt durch 512 teilbar.

Der Hauptalgorithmus von MD5 arbeitet mit einem 128-Bit-Puffer, der in vier 32-Bit-Wörter A, B, C und D unterteilt ist. Diese werden mit bestimmten Konstanten initialisiert. Auf diesen Puffer wird nun die Komprimierungsfunktion mit dem ersten 512-Bit-Block als Schlüsselparameter aufgerufen. Die Behandlung eines Nachrichtenblocks geschieht in vier einander ähnlichen Stufen, von Kryptografen „Runden“ genannt. Jede Runde besteht aus 16 Operationen, basierend auf einer nichtlinearen Funktion „F“, modularer Addition und Linksrotation. Es gibt vier mögliche „F“-Funktionen, in jeder Runde wird davon eine andere verwendet:

F(X,Y,Z) = (X\wedge{Y}) \vee (\neg{X} \wedge{Z})
G(X,Y,Z) = (X\wedge{Z}) \vee (Y \wedge \neg{Z})
H(X,Y,Z) = X \oplus Y \oplus Z
I(X,Y,Z) = Y \oplus (X \vee \neg{Z})

\oplus, \wedge, \vee, \neg stehen jeweils für XOR, AND, OR und NOT-Operationen.

Auf das Ergebnis wird dieselbe Funktion mit dem zweiten Nachrichtenblock als Parameter aufgerufen usw., bis zum letzten 512-Bit-Block. Als Ergebnis wird wiederum ein 128-Bit-Wert geliefert – die MD5-Summe.

Pseudocode

Es folgt der Pseudocode für den MD5-Algorithmus.

// Beachte: Alle Variablen sind vorzeichenlose (unsigned) 32-Bit-Werte und
// verhalten sich bei Berechnungen kongruent (≡) modulo 2^32

// Definiere r wie folgt:
var uint[64] r, k
r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}
r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}
r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}
r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}

// Verwende den binären Vorkommateil vom 2^32-fachen Betrag des Sinus
// von Integerwerten als Konstanten:
für alle i von 0 bis 63
    k[i] := floor(abs(sin(i + 1)) × 2^32)

// Initialisiere die Variablen: (lt. RFC 1321)
var uint h0 := 0x67452301
var uint h1 := 0xEFCDAB89
var uint h2 := 0x98BADCFE
var uint h3 := 0x10325476

// Vorbereitung der Nachricht 'message':
var uint message_laenge := bit_length(message)
erweitere message um bit "1"
erweitere message um bits "0" bis Länge von message in bits  448 (mod 512)
erweitere message um message_laenge als 64-Bit little-endian Integer

// Verarbeite die Nachricht in aufeinander folgenden 512-Bit-Blöcken:
für alle 512-Bit Block von message
    unterteile Block in 16 32-bit little-endian Worte w(i), 0 ≤ i ≤ 15

    // Initialisiere den Hash-Wert für diesen Block:
    var uint a := h0
    var uint b := h1
    var uint c := h2
    var uint d := h3

    // Hauptschleife:
    für alle i von 0 bis 63
        wenn 0 ≤ i ≤ 15 dann
            f := (b and c) or ((not b) and d)
            g := i
        sonst wenn 16 ≤ i ≤ 31 dann
            f := (b and d) or (c and (not d))
            g := (5×i + 1) mod 16
        sonst wenn 32 ≤ i ≤ 47 dann
            f := b xor c xor d
            g := (3×i + 5) mod 16
        sonst wenn 48 ≤ i ≤ 63 dann
            f := c xor (b or (not d))
            g := (7×i) mod 16
        wenn_ende
 
        temp := d
        d := c
        c := b
        b := ((a + f + k(i) + w(g)) leftrotate r(i)) + b 
        a := temp

    // Addiere den Hash-Wert des Blocks zur Summe der vorherigen Hashes:
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d

var uint digest := h0 append h1 append h2 append h3 //(Darstellung als little-endian)

Anstatt der Originalformulierung aus dem RFC 1321 kann zur Effizienzsteigerung Folgendes verwendet werden:

(0 ≤ i ≤ 15): f := d xor (b and (c xor d))
(16 ≤ i ≤ 31): f := c xor (d and (b xor c))

Sicherheitsüberlegungen

MD5 ist weit verbreitet und wurde ursprünglich als kryptografisch sicher angesehen. Bereits 1994 entdeckten Bert den Boer und Antoon Bosselaers Pseudokollisionen in MD5. Grundlegende Arbeit, um echte Kollisionen zu finden, leistete auch Hans Dobbertin (damals am BSI), der bereits den erfolgreichen Angriff auf MD4 entwickelt hatte und die dabei verwendeten Techniken auf MD5 übertrug.

Inzwischen sind die Kollisionsangriffe so weit fortgeschritten, dass eine weitere Nutzung von MD5, insbesondere in solchen Szenarien, in denen der Nutzer nicht die zu signierenden Dateien komplett kontrolliert, abzulehnen ist. Ein 2009 durchgeführter Test des Computermagazins c’t unter Verwendung von GPGPU ermöglicht es einem etwa ein Jahr alten Highend-Spiele-PC mit zwei Nvidia GeForce 9800 GX2 (insgesamt vier Grafikprozessoren), in knapp 35 Minuten eine Kollision zu finden.[4]

Da noch kein erster Preimage-Angriff bekannt ist, sind in der Vergangenheit mit MD5 signierte Dateien hingegen aktuell noch sicher.

Regenbogentabellen (Rainbow Tables)

Eine andere Angriffsmethode stellen Regenbogentabellen dar. In diesen Tabellen sind Zeichenketten mit den zugehörigen MD5-Hashwerten gespeichert. Der Angreifer durchsucht diese Tabellen nach dem vorgegebenen Hashwert und kann dann passende Zeichenketten auslesen. Dieser Angriff kann vor allem eingesetzt werden, um Passwörter zu ermitteln, die als MD5-Hashes gespeichert sind. Die dazu notwendigen Regenbogentabellen sind jedoch sehr groß und es bedarf eines hohen Rechenaufwands, um sie zu erstellen. Deshalb ist dieser Angriff im Allgemeinen nur bei kurzen Passwörtern möglich. Für diesen Fall existieren vorberechnete Regenbogentabellen, bei denen zumindest der Rechenaufwand zum Erstellen der Liste entfällt. Die Verwendung eines Salt, also eines zufälligen nicht vorhersehbaren Wertes, welcher an den Klartext angefügt wird, kann die Effektivität von vorberechneten Regenbogentabellen jedoch zunichte machen.

Zum Verschlüsseln von Passwörtern sollten aber auch Algorithmen in Betracht gezogen werden, die speziell für diesen Zweck entwickelt wurden, z.B. bcrypt.

Die Analysemethode

Im August 2004 fand ein chinesisches Wissenschaftlerteam die erste Kollision in der vollständigen MD5-Funktion.[5] Auf einem IBM-P690-Cluster benötigte ihr erster Angriff eine Stunde, davon ausgehend ließen sich weitere Kollisionen innerhalb von maximal fünf Minuten finden. Der Angriff der chinesischen Forscher basierte auf Analysen. Kurz nach der Veröffentlichung der Arbeit der Chinesen wurde MD5CRK eingestellt, das versuchte, Kollisionen per Brute-Force-Methode zu finden.

Kurzbeschreibung[6]: Ein Eingabeblock (512 Bit) wird modifiziert, wobei versucht wird, eine bestimmte Differenz zum Original im Ausgang zu erzeugen. Durch eine aufwändige Analyse des Algorithmus kann die Anzahl der unbekannten Bits so weit verringert werden, dass dies rechnerisch gelingt. Im nächsten 512-Bit-Block wird mit den gleichen Methoden versucht, die Differenz wieder aufzuheben. Die Fälschung benötigt also einen zusammenhängenden Datenblock von 1024 Bit = 128 Byte, was den Einsatz stark einschränkt.

Kollisionen finden heißt, man sucht ein M (Text) und ein M' (Kollision), so dass hash(M) = hash(M'). Preimage-Angriff heißt, man sucht zu vorgegebenen M bzw. hash(M) ein M', so dass hash(M) = hash(M'). Da man beim Preimage-Angriff nur M' kontrolliert, nicht auch M, ist dieser viel schwieriger.

Derzeit ist MD5 nur bezüglich der Kollisions-Angriffe geknackt. Deswegen besteht noch keine akute Gefahr für Passwörter, die als MD5-Hash gespeichert wurden, diese Kollisionen sind eher eine Gefahr für digitale Signaturen.

Literatur

  • Hans Dobbertin: Cryptanalysis of MD5 compress. Announcement on Internet, Mai 1996 (englisch, online)
  • Hans Dobbertin: The Status of MD5 After a Recent Attack. In: CryptoBytes 2(2), 1996 (englisch, online)
  • Philip Hawkes, Michael Paddon, Gregory G. Rose: Musings on the Wang et al. MD5 Collision. Detaillierte Analyse der differentiellen Attacke auf den MD5 (englisch)
  • Vlastimil Klima: Finding MD5 Collisions on a Notebook PC using multi-message modifications. Nochmals verbesserte Angriffstechnik (englisch)

Einzelnachweise

  1. Alexander Sotirov; Marc Stevens, Jacob Appelbaum, Arjen Lenstra, David Molnar, Dag Arne Osvik, Benne de Weger (30. Dezember 2008): MD5 considered harmful today. Abgerufen am 30. Dezember 2008.
  2. HashCheck Shell Extension
  3. System.Security.Cryptography-Namespace (MSDN – .NET Framework Developer Center )
  4. Stefan Arbeiter, Matthias Deeg: Bunte Rechenknecht – Grafikkarten beschleunigen Passwort-Cracker. In: c’t, Ausgabe 06/2009, S. 204. (kostenpflichtig online abrufbar unter: [1])
  5. Kollisionsanalyse
  6. Erläuterung zum Kollisionsproblem bei Manipulation von md5-Hashwerten

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем решить контрольную работу

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Message-Digest Algorithm 2 — (MD2) ist eine von Ronald L. Rivest im Jahr 1988 veröffentlichte Hash Funktion. Der Algorithmus wurde für 8 Bit Rechner optimiert. Der Hashwert einer beliebigen Nachricht wird gebildet, indem zunächst die Nachricht auf ein Vielfaches der… …   Deutsch Wikipedia

  • Message Digest Algorithm 2 — (MD2) ist eine von Ronald L. Rivest im Jahr 1988 veröffentlichte Hash Funktion. Der Algorithmus wurde für 8 Bit Rechner optimiert. Der Hashwert einer beliebigen Nachricht wird gebildet, indem zunächst die Nachricht auf ein Vielfaches der… …   Deutsch Wikipedia

  • Message Digest Algorithm 4 — MD4 (engl. Message Digest Algorithm 4) wurde 1990 von Ronald L. Rivest veröffentlicht. Der MD4 Hash Algorithmus wurde mit dem Anspruch entwickelt, auf 32 Bit Rechnern besonders schnell zu laufen und gleichzeitig in der Implementierung einfach zu… …   Deutsch Wikipedia

  • Message-Digest Algorithm 4 — MD4 (engl. Message Digest Algorithm 4) wurde 1990 von Ronald L. Rivest veröffentlicht. Der MD4 Hash Algorithmus wurde mit dem Anspruch entwickelt, auf 32 Bit Rechnern besonders schnell zu laufen und gleichzeitig in der Implementierung einfach zu… …   Deutsch Wikipedia

  • Message Digest Algorithm 5 — MD5 (Message Digest Algorithm 5) ist eine weit verbreitete kryptographische Hashfunktion, die einen 128 Bit Hashwert erzeugt. MD5 wurde 1991 von Ronald L. Rivest entwickelt. Die errechneten MD5 Summen (kurz md5sum) werden zum Beispiel zur… …   Deutsch Wikipedia

  • Message-Digest 4 — MD4 (engl. Message Digest Algorithm 4) wurde 1990 von Ronald L. Rivest veröffentlicht. Der MD4 Hash Algorithmus wurde mit dem Anspruch entwickelt, auf 32 Bit Rechnern besonders schnell zu laufen und gleichzeitig in der Implementierung einfach zu… …   Deutsch Wikipedia

  • Message-Digest 5 — MD5 (Message Digest Algorithm 5) ist eine weit verbreitete kryptographische Hashfunktion, die einen 128 Bit Hashwert erzeugt. MD5 wurde 1991 von Ronald L. Rivest entwickelt. Die errechneten MD5 Summen (kurz md5sum) werden zum Beispiel zur… …   Deutsch Wikipedia

  • Message-Digest — Mit Message Digest wird eine Gruppe kryptografischer Protokolle bezeichnet. Es handelt sich um Einweg Hash Funktionen. Diese Funktionen treten mit dem Anspruch auf, dass sie nicht umkehrbar seien und auch keine Kollision berechenbar sei. Das… …   Deutsch Wikipedia

  • Digest — can refer to any of the following: A condensed collection or compendium of writings: Pandects, or The Digest , a digest of Roman law A tax digest Digest size magazine format, used by some magazines (though not always consistently used by… …   Wikipedia

  • Secure Hash Algorithm 1 — Der Begriff secure hash algorithm (engl. für sicherer Hash Algorithmus), kurz SHA, bezeichnet eine Gruppe standardisierter kryptologischer Hash Funktionen. Diese dienen zur Berechnung eines eindeutigen Prüfwerts für beliebige elektronische Daten …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”