Md5
Inhoud |
Wat is MD5?
MD5 is een berekening, een algorythme dat een hexadecimale string van 8/16 of 32 tekens (een hash) genereert uit een string of bestand.
De lengte van de hash hangt af van welke versie van MD5 je gebruikt, niet van de lengte van de bron waar je de hash van berekent. Een string van 3 bytes levert een hash van b.v. 16 tekens op, en een bestand van 4MB geeft met dezelfde MD5 ook een hash van 16 tekens.
Niet omkeerbaar
Het is niet mogelijk (gewoon niet, punt) om een MD5 hash om te rekenen naar de bron waarover hij gemaakt is. De routine deelt, rondt af en vermenigvuldigt herhaaldelijk om tot een hash van 16 tekens te komen. De originele data zit er gewoon helemaal niet meer in.
Brute force
De enige manier om een MD5 te "kraken" is om de MD5 hash te weten, en dan gewoon alle mogelijke strings af te gaan en de MD5 van elke string te berekenen net zolang tot je een string tegenkomt die dezelfde MD5 geeft.
Dit kun je eenvoudig tegengaan door niet de md5 van de originele data op te slaan, maar eerst een bewerking op de data te doen. Als een hacker dan de bron van de hash achterhaalt via brute-force, dan heeft hij de bron plus die verandering gevonden. Als hij dat invoert in jouw applicatie dan doet jouw applicatie die verandering nog een keer en klopt de data alsnog niet.
Collisions
Een collision is een setje van twee of meer brondata (niet perse van gelijke lengte) die allemaal dezelfde hash geven als ze door MD5 gehaald worden.
Een hash is immers slechts 16 hexadecimale tekens lang dus er zijn slechts 16^16=18.446.744.073 miljard mogelijke hashes. Dat klinkt als heel veel, maar een bestand van 8 gewone bytes heeft 256^8=18.446.744.073 miljard mogelijk combinaties.
Theoretisch kun je dus al vanaf een string van 9 bytes collisions verwachten. In de praktijk is de eerste collision gevonden op twee stukken binaire data van meer dan twee kilobyte. Als je in je wachtwoordroutine een controle op lengte doet ban je de collisions dus helemaal uit.
Zijn collisions een probleem?
Meestal niet. Voor wachtwoorden sowieso niet, omdat die bestaan uit letters en cijfers en niet de volledige 256 mogelijke waarden per byte. Voor kleine bronnen zijn er gewoon geen collisions.
Voor grote bestanden wordt het een probleem als de originele bestandsafmeting niet bekend is. Een collision kan soms met dezelfde bestandsafmeting gemaakt worden, maar door de structuur van programma's is het aantal veranderingen dat je binnen een bestand kunt maken zonder de lengte te veranderen zeer klein.
Praktische toepassing
Een simpel voorbeeld hoe een password middels MD5 versleuteld opgelagen kan worden en weer gecontroleerd. In het voorbeeld wordt de functie db_query() gebruikt. Gebruik hier mysql_query(), mssql_query(), oci_execute(), net wat voor jouw database nodig is.
Het opslaan:
$user = 'u.ser'; $pass = 'geheim'; $sql = "INSERT INTO gebruikers (username, passwd) VALUES ('%s', '%s')"; db_query(sprintf($sql, $user, md5($pass));
NB: merk op dat $user in dit simpele voorbeeld niet beveiligd is. Een username met een apostroph er in kan tot problemen of veiligheidslekken leiden: [1] en [2]
In de database staat nu een record
| username | passwd |
|---|---|
| u.ser | e8636ea013e682faf61f56ce1cb1ab5c |
Het controleren:
$user = 'u.ser'; $pass = 'geheim'; $sql = "SELECT COUNT(*) ok FROM gebruikers WHERE username = '%s' AND passwd = '%s'"; $res = db_query($sql, $user, md5($pass)); $ok = db_num_rows($res);
Alternatieven
Alternatieven voor MD5 zijn er legio, b.v. SHA1 en SHA2. Welke je toe moet passen zal hoofdzakelijk afhangen van de ondersteuning van je programmeertaal, database etc.





