MD5-hash maken

Plak een tekst en lees de MD5 ervan: tweeëndertig hexadecimale tekens, berekend uit de UTF-8-bytes van wat je typt. MD5 is voor alles wat met beveiliging te maken heeft gebroken — een botsing maak je in seconden op een laptop — en als checksum tegen toevallige beschadiging doet het nog altijd wat het moet doen. Het rekenen gebeurt op deze pagina.

Resultaat

Het antwoord verschijnt hier terwijl je typt.

  • Waar het draait

    Er wordt niets geüpload, want er is geen bestand — het wordt in deze pagina uitgerekend.

  • Geen wachtrij, geen account

    Het antwoordt zo snel als je machine kan, en vraagt nooit wie je bent.

  • Zo vaak als je wilt

    Er wordt niets geteld en niets begrensd — nog eens antwoorden kost ons niets.

Hoe het werkt

  1. Plak de tekst in het veld.
  2. Kopieer de 32 hexadecimale tekens.
  3. Er is niets geüpload: het rekenen gebeurt op de pagina.

Wat «gebroken» hier precies betekent

MD5 is botsingsgevoelig: je kunt twee verschillende invoeren maken die dezelfde hash opleveren, en sinds 2004 kost dat geen rekencluster meer maar seconden op gewone hardware. Dat is wat het onbruikbaar maakt overal waar de hash iets moet vastleggen dat een ander niet mag vervangen.

Wat niet gebroken is, is het terugrekenen. Uit een MD5 de oorspronkelijke tekst afleiden is nog steeds niet doenlijk — maar dat helpt niet, want een aanvaller hoeft jouw tekst niet te vinden. Hij hoeft alleen een tweede tekst te maken met dezelfde hash, en die vrijheid is precies wat botsingen hem geven.

Waarom het niet voor wachtwoorden deugt

MD5 is ontworpen om snel te zijn, en dat is voor wachtwoorden de verkeerde eigenschap. Een gewone videokaart rekent er miljarden per seconde doorheen, dus een lijst gehashte wachtwoorden uit een gelekte database is met een woordenboek binnen een dag grotendeels open.

Wat wel deugt zijn functies die met opzet traag en geheugenintensief zijn: bcrypt, scrypt en Argon2. Ze hebben een instelbare kostenfactor, zodat de verdediging meegroeit met de hardware. Een salt erbij helpt tegen kant-en-klare tabellen en verandert niets aan de snelheid, en snelheid is hier het hele probleem.

Waar het nog wél voor deugt

Als checksum tegen toevallige beschadiging is MD5 in orde. Een bestand dat halverwege een overdracht is afgekapt of een schijf met een omgevallen bit levert een andere hash op, en daar is geen tegenstander bij betrokken die iets probeert te vervalsen.

Hetzelfde geldt voor cachesleutels, deduplicatie en het snel vergelijken van grote hoeveelheden inhoud. In al die gevallen is de vraag «zijn deze twee dingen hetzelfde», gesteld aan gegevens die niemand kwaad wil doen. Zodra iemand er belang bij heeft dat twee verschillende dingen hetzelfde lijken, is MD5 de verkeerde keuze.

Tweeëndertig tekens, en geen een meer

Een MD5 is altijd 128 bits, geschreven als tweeëndertig hexadecimale tekens. De lengte hangt niet af van de invoer: een leeg tekstveld en een boek van duizend bladzijden leveren allebei tweeëndertig tekens op.

Dat maakt de lengte tot de snelste controle die er is. Zesendertig tekens betekent dat er streepjes in zitten en dat je naar een UUID kijkt, veertig betekent SHA-1, vierenzestig SHA-256. Krijg je een waarde binnen waarvan je het algoritme niet weet, dan geeft tellen het antwoord in twee seconden.

Het regeleinde aan het eind van een bestand

De meest voorkomende reden dat een waarde hier niet overeenkomt met wat `md5sum` in een terminal geeft, is één byte: `echo test | md5sum` hasht `test` mét een afsluitend regeleinde, want dat is wat `echo` toevoegt. Met `echo -n` valt het weg en komt de waarde wel overeen.

Hetzelfde geldt voor een tekstbestand dat je editor met een lege regel aan het eind bewaart, wat op Unix de conventie is. De hash weet niet dat die byte er onbedoeld bij zit; hij hasht wat er staat. Bij een verschil is dit de eerste plek om te kijken, nog vóór de codering.

Trema’s en accenten veranderen de uitkomst

Een hash wordt over bytes berekend, niet over tekens, dus de codering hoort bij de vraag. Hier is dat altijd UTF-8, waar een `ë` de twee bytes `c3 ab` is. In Latin-1 zou dezelfde letter één byte `eb` zijn geweest, en dan is de hash een andere.

Daarom loopt een vergelijking tussen twee systemen juist mis bij woorden als «ideeën» of «café» en niet bij `test`. Komen twee waarden niet overeen en zitten er niet-ASCII-tekens in, dan is het verschil vrijwel zeker de codering en niet het algoritme — en dat verschil zit een laag onder de hash.

Waarom tekst en niet een bestand

Deze pagina hasht tekst uit een veld en neemt geen bestanden aan. Dat is een keuze: wie de MD5 van een bestand nodig heeft, heeft die bijna altijd al bij de hand met `md5sum`, `certutil -hashfile` of `Get-FileHash` in PowerShell, en heeft er geen webpagina voor nodig.

De vraag die wél vaak in een browser komt is de andere: een waarde uit een database vergelijken, een cachesleutel nabouwen, controleren wat een oude koppeling van een tekst maakt. Daar past een tekstveld bij, en het scheelt bovendien dat er geen bestand hoeft te worden ingelezen dat er niet toe doet.

Wat een cachesleutel met MD5 werkelijk is

Veel cachelagen zetten een lange sleutel — een URL met parameters, een query met filters — door MD5 heen om er iets van vaste lengte van te maken. Dat is een legitiem gebruik: er is geen tegenstander, alleen een sleutelruimte die netjes moet zijn.

De valkuil zit ergens anders. Als de invoer voor die sleutel per ongeluk iets weglaat — de taal, de gebruikersrol, een filter — dan delen twee verzoeken die verschillende antwoorden horen te krijgen één sleutel, en krijgt de een het antwoord van de ander. De hash is dan niet stuk; de sleutel was onvolledig.

Een e-mailadres hashen anonimiseert niets

Een MD5 van een e-mailadres wordt met enige regelmaat gepresenteerd als geanonimiseerde vorm, en dat is ze niet. De verzameling bestaande adressen is klein genoeg om domweg door te rekenen: wie een lijst adressen heeft, hasht die en zoekt op, en dat kost geen noemenswaardige tijd.

Precies dat mechanisme zit achter de avatars van Gravatar, waar de MD5 van je adres in de afbeeldings-URL staat. Het is niet omkeerbaar in de wiskundige zin en het is in de praktijk volstrekt herleidbaar, en dat is het verschil dat bij dit soort claims steeds wordt overgeslagen.

Waarom er geen veld voor een salt is

Een salt hoort bij het opslaan van wachtwoorden, en daarvoor is MD5 hoe dan ook de verkeerde functie. Een saltveld hier zou de indruk wekken dat de combinatie iets veiligs oplevert, en dat doet ze niet: een gesalte MD5 is nog steeds miljarden pogingen per seconde per videokaart.

Wie een salt nodig heeft, heeft bcrypt, scrypt of Argon2 nodig, en die genereren en bewaren hun salt zelf in de uitvoerreeks. Dat hier weglaten is geen ontbrekende functie maar het weigeren van een uitnodiging tot iets dat er goed uitziet en niet werkt.

Hashen is niet anonimiseren, en de AVG weet dat

Een hash van een persoonsgegeven blijft onder de AVG een persoonsgegeven zolang de herleiding mogelijk is, en bij adressen, telefoonnummers en klantnummers is ze dat: de verzameling is klein en doorrekenen is goedkoop. Het is pseudonimisering, niet anonimisering, en dat onderscheid heeft rechtsgevolgen.

Wat deze pagina wel zeker stelt is het praktische deel: de tekst die je erin plakt wordt op je eigen machine gehasht en niet aan ons verstrekt. Het netwerktabblad laat zien dat er geen verzoek vertrekt dat je invoer draagt, en bij een adres of een klantnummer is dat het enige dat telt.

MD5-hash maken: veelgestelde vragen

Kan ik een MD5 terugrekenen?

Niet rechtstreeks. Wat wel kan is de invoer opzoeken in kant-en-klare tabellen of hem raden, en dat lukt bij korte of veelvoorkomende teksten bijna altijd. De echte zwakte van MD5 zijn botsingen, geen terugrekening.

Kan ik het gebruiken om wachtwoorden op te slaan?

Nee. MD5 is snel, en dat is precies verkeerd: een videokaart doet er miljarden per seconde. Gebruik bcrypt, scrypt of Argon2, die met opzet traag zijn en een instelbare kostenfactor hebben.

Waarom komt het niet overeen met wat md5sum geeft?

Bijna altijd door een afsluitend regeleinde: echo voegt er een toe. Met echo -n valt het weg en komen de waarden overeen. Zitten er niet-ASCII-tekens in, controleer dan of de andere kant ook UTF-8 gebruikt.

Deugt het nog om downloads te controleren?

Tegen toevallige beschadiging wel, tegen een tegenstander niet. Wie het bestand kan vervangen kan er een tweede bij maken met dezelfde MD5. Voor een echte integriteitscontrole hoort daar SHA-256 te staan.

Verlaat de tekst mijn machine?

Nee. Het rekenen gebeurt op deze pagina, in je browser. Dat telt hier, want wat mensen hashen is vaak een adres, een klantnummer of een kandidaat-wachtwoord.

Andere hulpmiddelen