MD5 (Message Digest Algorithm 5) is een veelgebruikte hashfunctie met een 128 bit-hashwaarde. Hoewel MD5 oorspronkelijk bedoeld was als cryptografische hashfunctie bleken er een hoop fouten in het ontwerp te zitten. MD5 is eerder als internetstandaard[1] gebruikt in vele veiligheidstoepassingen en wordt ook gebruikt om de integriteit van bestanden te controleren tegen onbedoelde corruptie. MD5 werd door Ronald Rivest in 1991 ontworpen om de eerdere hashfunctie MD4 te vervangen. In 1996 werd er een fout in het MD5-ontwerp gevonden; hoewel het geen ernstige fout was, werd het aanbevolen andere algoritmen zoals SHA-1 te gebruiken. (hoewel ook deze gelijke fouten bevat).[2]

In 2007 is het een groep wetenschappers gelukt om twaalf verschillende PDF-bestanden met dezelfde hashcode te maken, zogenaamde hash collisions. De auteurs hebben daarmee aangetoond dat MD5 beter niet meer gebruikt kan worden als een verificatiemethode. Op 30 december 2008 gaven zij hiervan een praktijkvoorbeeld door een SSL-autoriteitscertificaat te vervalsen voor demonstratiedoeleinden. In 2012 werd een MD5-collision aanval gebruikt voor het vervalsen van Microsoft-certificaten door de Flame-malware.[3]

Om wachtwoorden die als MD5-hash gecodeerd zijn te "kraken" maakt men vaak gebruik van rainbow tables.

Pseudocode bewerken

Pseudocode voor het MD5-algoritme volgt.

//Opmerking: Alle variabelen hebben als type een 32-bits integer zonder teken (unsigned) tijdens de berekening
//Definieer r als het volgende
var int[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}
//Use binary fractional part of the sines of integers as constants:
for i from 0 to 63
k[i] := floor(abs(sin(i + 1)) × 2^32)
//Initialiseer de variabelen:
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476
//Voorbewerking:
voeg "1" bit aan het bericht toe
voeg "0" bits aan bericht toe totdat berichtlengte in bits ≡ 448 (mod 512)
voeg bitlengte van het originele bericht als 64-bit little-endian integer toe aan bericht
//Verwerk het bericht in opeenvolgende blokken van 512-bit:
for each 512-bit chunk of message
break chunk into sixteen 32-bit little-endian words w(i), 0 ≤ i ≤ 15
//Initialiseer de hashwaarde voor dit blok:
var int a := h0
var int b := h1
var int c := h2
var int d := h3
//Hoofdlus:
for i from 0 to 63
if 0 ≤ i ≤ 15 then
f := (b and c) or ((not b) and d)
g := i
else if 16 ≤ i ≤ 31
f := (d and b) or ((not d) and c)
g := (5×i + 1) mod 16
else if 32 ≤ i ≤ 47
f := b xor c xor d
g := (3×i + 5) mod 16
else if 48 ≤ i ≤ 63
f := c xor (b or (not d))
g := (7×i) mod 16
temp := d
d := c
c := b
b := ((a + f + k(i) + w(g)) leftrotate r(i)) + b
a := temp
//Tel de hash van dit blok op bij het resultaat tot nog toe:
h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d
var int digest := h0 append h1 append h2 append h3 //(uitgedrukt als little-endian)

Opmerking: In plaats van de formulering van de originele RFC 1321[1] zoals hier getoond kan het volgende gebruikt worden om de efficiëntie te verbeteren:

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

MD5-hashes bewerken

De 128 bit-(16 byte-)MD5-hashes worden meestal weergegeven als 32-cijferige hexadecimale getallen. Het volgende laat een 46 bytes-ASCII-invoer en de bijbehorende MD5-hash zien:

MD5("Pa's wijze lynx bezag vroom het fikse aquaduct") = b06c0444f37249a0a8f748d3b823ef2a

Zelfs een kleine verandering in de tekst zal (naar grote waarschijnlijkheid) een compleet andere hash genereren, bijvoorbeeld het vervangen van P naar M:

MD5("Ma's wijze lynx bezag vroom het fikse aquaduct") = de1c058b9a0d069dc93917eefd61f510

De hash van een lege tekenreeks is:

MD5("") = d41d8cd98f00b204e9800998ecf8427e

Zie ook bewerken

Externe link bewerken

  • (en) MD5 Collision Demo, Peter Selinger. Het creëren van verschillende uitvoerbare programma's met dezelfde MD5.