Wat deze tool doet
Typ of plak wat dan ook in het vak en elke hash hieronder werkt zich bij terwijl je typt: MD5, SHA-1, SHA-256, SHA-224, SHA-512, SHA-384, SHA3-256 en RIPEMD-160, allemaal van dezelfde invoer, naast elkaar. Elke rij kan afzonderlijk gekopieerd worden, en de hex kan omgezet worden naar hoofdletters voor de systemen die het zo afdrukken.
Acht algoritmes tegelijk zien is nuttiger dan het klinkt. Meestal ben je niet aan het kiezen tussen algoritmes — je probeert uit te zoeken welk algoritme een waarde heeft opgeleverd die iemand je gaf, of te controleren of wat je code berekent overeenkomt met wat een specificatie zegt dat het zou moeten zijn. Een hexadecimale tekenreeks van 32 tekens is MD5, 40 is SHA-1 of RIPEMD-160, 64 is SHA-256 of SHA3-256, 96 is SHA-384 en 128 is SHA-512. De oorspronkelijke tekst hier plakken en de rijen vergelijken, regelt het in een seconde.
De invoer wordt behandeld als UTF-8-bytes, wat ook is wat vrijwel al het andere doet, en het aantal bytes naast de knoppen laat zien hoeveel bytes dat werkelijk is — een nuttige herinnering dat een teken met accent of een emoji meer dan één byte is, en dat "café" hashen niet hetzelfde is als vier bytes hashen.
Wat een hash is, en wat niet
Een cryptografische hash neemt invoer van elke grootte en produceert er een vingerafdruk van vaste lengte van. Dezelfde invoer geeft altijd dezelfde hash, één veranderd bit geeft een volledig andere, en de functie is zo ontworpen dat je niet van de hash terug kunt rekenen naar de invoer, of twee inputs kunt vinden die dezelfde hash opleveren.
Het meest voorkomende misverstand verdient het om expliciet te worden benoemd: hashen is geen versleuteling. Versleuteling is per ontwerp omkeerbaar — dat is het hele punt ervan — en hashen is helemaal niet omkeerbaar. Er is geen sleutel, geen ontsleuteloperatie en geen manier om de invoer uit de uitvoer terug te halen. Wat mensen bedoelen als ze zeggen dat een hash "gekraakt" is, is dat iemand een invoer heeft geraden die dezelfde hash oplevert, meestal door miljarden waarschijnlijke kandidaten te proberen — iets heel anders dan het omkeren van de functie.
Dat onderscheid bepaalt waar hashes goed voor zijn: verifiëren dat iets niet veranderd is, twee dingen vergelijken zonder ze prijs te geven, inhoud indexeren op basis van wat erin staat in plaats van op naam, en handtekeningen en berichtauthenticatiecodes bouwen. Het bepaalt ook waar ze niet goed voor zijn, wat het volgende hoofdstuk is.
Welke moet je gebruiken?
Voor alles nieuws: SHA-256. Het is snel, universeel geïmplementeerd, en heeft geen bekende praktische zwakte; tenzij iets in je stack anders vereist, is het de standaard die geen rechtvaardiging nodig heeft. SHA-512 is op geen enkele manier "veiliger" die er voor de meeste toepassingen toe doet, maar is vaak sneller op 64-bit hardware en geeft een langere hash waar je die wilt. SHA-384 is SHA-512 afgekapt, en bestaat vooral omdat sommige standaarden het voorschrijven. SHA-224 is hetzelfde idee toegepast op SHA-256, en is zeldzaam buiten specifieke protocollen.
SHA3-256 is geen vervanging voor SHA-256 en geen upgrade ervan — het is een andere constructie, gekozen via een publieke competitie, bewust gebouwd op volledig andere wiskunde. Het doel ervan is verzekering: als er ooit een structurele zwakte gevonden zou worden in de SHA-2-familie, zou SHA-3 die niet erven. Gebruik het wanneer een specificatie erom vraagt, of wanneer je die onafhankelijkheid bewust wilt.
RIPEMD-160 is een Europees ontwerp uit hetzelfde tijdperk als SHA-1 dat veel beter ouder is geworden, en overleeft vooral omdat Bitcoin-adressen erop gebouwd zijn. Als je niet met cryptovaluta werkt, heb je het vrijwel zeker niet nodig.
MD5 en SHA-1 zijn gebroken en daarom hierboven als verouderd gemarkeerd. Botsingen — twee verschillende inputs met dezelfde hash — kunnen doelbewust, goedkoop en op aanvraag geproduceerd worden; dit is in het wild aangetoond tegen beide. Ze zijn niet veilig voor handtekeningen, certificaten, deduplicatie waarbij een aanvaller de invoer beheerst, of iets waar een veiligheidsbeslissing van afhangt. Ze blijven volkomen redelijk als niet-security-controle tegen onbedoelde corruptie, en als identifiers in legacysystemen die geen aanvaller in hun model hebben, en daarom staan ze hier nog steeds.
Hash nooit een wachtwoord met deze
Dit is de fout die keer op keer terugkomt in inbraakrapporten, dus verdient het zijn eigen hoofdstuk. Als je wachtwoorden opslaat, is geen van de algoritmes op deze pagina het juiste gereedschap — zelfs SHA-512 niet, zelfs niet met een salt.
De reden is snelheid. Elk algoritme hier is ontworpen om zo snel mogelijk te zijn, wat precies is wat je wilt voor het verifiëren van een download en precies wat je niet wilt voor een wachtwoord. Moderne hardware berekent miljarden SHA-256-hashes per seconde, dus een gestolen tabel met snelle hashes kan aangevallen worden met een snelheid die de meeste echte wachtwoorden binnen enkele uren tot platte tekst maakt. Een salt toevoegen stopt vooraf berekende rainbow tables en dwingt de aanvaller om per account te werken; het doet niets aan de snelheid.
Wat je wilt is een bewust trage, geheugenintensieve functie die voor het doel gebouwd is: Argon2id voor nieuwe systemen, bcrypt of scrypt waar dat is wat je platform biedt. Ze kosten een instelbare hoeveelheid tijd en geheugen per poging, wat onmerkbaar is wanneer een gebruiker inlogt en verwoestend wanneer iemand een woordenboek probeert. Elk serieus framework levert er één mee — in PHP is dat password_hash() — en in de praktijk zou je de hashingstap nooit zelf moeten schrijven.
Waar hashes hun nut bewijzen
Bestands- en downloadintegriteit. Een gepubliceerde SHA-256 naast een download laat je bevestigen dat wat aankwam is wat gepubliceerd werd. Let op wat dit wel en niet bewijst: het detecteert corruptie en onderschepping tijdens transport, maar als een aanvaller de pagina beheerst, beheerst hij ook de checksum die erop staat — daarom zijn handtekeningen, niet losse checksums, wat een softwaretoeleveringsketen beschermt.
Wijzigingsdetectie. Een record, een configuratiebestand of een gerenderd document hashen geeft je een goedkope manier om te beantwoorden "is dit hetzelfde als de vorige keer" zonder het geheel op te slaan of te vergelijken. Content-addressed systemen — Git-commits, containerlagen, deduplicerende back-ups — zijn dit idee tot zijn logische conclusie doorgevoerd: de hash is de identifier.
Vergelijken zonder prijs te geven. Twee partijen kunnen hashes vergelijken om te zien of ze dezelfde waarde hebben zonder dat een van beide de waarde overhandigt. Dit is echt nuttig, en ook regelmatig misbruikt: voor een invoer met lage entropie zoals een e-mailadres of een telefoonnummer is de hash helemaal niet anoniem, want iedereen kan elke kandidaat hashen en het antwoord opzoeken. Een e-mailadres hashen de-identificeert het niet.
Handtekeningen en berichtauthenticatie. Digitale handtekeningen ondertekenen een hash in plaats van het document, en HMAC gebruikt een hash plus een geheime sleutel om te bewijzen dat een bericht van iemand kwam die die sleutel bezit en niet gewijzigd is. Beide zijn de reden waarom een botsingsaanval op de onderliggende hash zo'n ernstige gebeurtenis is — en waarom MD5 en SHA-1 nergens meer acceptabel zijn in de buurt van een van beide.
Niets van wat je typt verlaat je browser
Elke hash op deze pagina wordt lokaal berekend. De SHA-familie komt van de eigen crypto.subtle-implementatie van je browser; MD5, SHA-224, SHA3-256 en RIPEMD-160 worden berekend door het script op deze pagina. Niets van wat je typt wordt een netwerkverzoek: geen upload, geen cookie, geen lokale opslag, geen log.
Dat doet er hier meer toe dan bij de meeste tools, vanwege wat mensen in een hashvak plakken. Uitzoeken waarom een handtekening niet verifieert, betekent de exacte tekenreeks plakken die ondertekend werd — een API-payload, een sessietoken, een gedeeld geheim, een klantrecord. Bij een server-side hashtool staat dat allemaal nu in iemand anders' requestlog, en de hash die je terugkrijgt bewijst niets over wat er met de invoer gebeurd is.
Controleer het liever dan het op vertrouwen aan te nemen: open je netwerktabblad en typ. Afgezien van de analytics-beacon die deze site bij elke paginalading verstuurt — een URL en een paginatitel, net als elke andere pagina hier — wordt er niets verstuurd, wat je ook plakt. Verbreek de netwerkverbinding volledig en de hashes werken zich nog steeds bij.
Een uitgewerkt voorbeeld
Typ abc en vergelijk de rijen met de gepubliceerde testvectoren, wat de standaardmanier is om elke implementatie te controleren: MD5 geeft 900150983cd24fb0d6963f7d28e17f72, SHA-1 geeft a9993e364706816aba3e25717850c26c9cd0d89d, SHA-256 geeft ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad, SHA3-256 geeft 3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532 en RIPEMD-160 geeft 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc.
Voeg nu één punt toe en zie hoe elke rij volledig verandert in plaats van een beetje. Die eigenschap — een verandering van één bit die een onherkenbaar andere hash oplevert — heet het lawine-effect, en het is wat een hash nuttig maakt voor het detecteren van verandering: er bestaat niet zoiets als twee hashes die "bijna" gelijk zijn, en geen informatie over hoe gelijkend de inputs waren.
Nee. De hashes worden in je browser berekend en bestaan alleen in de pagina voor je. Er is geen cookie, geen lokale opslag en geen logging van wat je plakt, wat ook waarom een herlaad het vak leegt.
Nee. Er is geen sleutel en geen inverse bewerking. Wat wel kan, is raden: enorme aantallen waarschijnlijke inputs hashen tot er een matcht. Dat werkt goed tegen korte of voorspelbare inputs, en dat is precies waarom wachtwoorden een traag, gesalt algoritme nodig hebben in plaats van een van deze.
SHA-256, tenzij iets anders voorschrijft. SHA-512 waar je een langere hash wilt of op 64-bit hardware zit, SHA3-256 wanneer een standaard erom vraagt of je een constructie wilt die los staat van SHA-2, RIPEMD-160 eigenlijk alleen voor Bitcoin-adressen. Niet MD5 of SHA-1 voor iets waar een veiligheidsbeslissing op rust.
Omdat ze nog overal zijn: legacydatabases, ETags, bestandsmanifesten, oude API's. Een waarde lezen die al bestaat, is een legitieme reden om er een te berekenen. Ze zijn gemarkeerd als verouderd omdat ze gebroken zijn voor alles wat vijandig is — opzettelijke botsingen zijn goedkoop voor beide.
Niet beter — anders. SHA-3 gebruikt een volledig andere interne constructie, dus een breuk in de ene familie zou niet overslaan naar de andere. SHA-256 heeft vandaag geen praktische zwakte, dus SHA-3 wordt gekozen om die onafhankelijkheid, of omdat een specificatie het noemt, eerder dan als upgrade.
Bijna altijd codering of witruimte. Deze pagina hasht de UTF-8-bytes van precies wat er in het vak staat; een andere tool gebruikt mogelijk UTF-16, voegt mogelijk een regeleinde toe, of hasht mogelijk een hex-gedecodeerde waarde in plaats van de tekst. Het aantal bytes naast de knoppen is de snelste manier om een verschil op te sporen.
Niet hier — dit vak neemt tekst. Gebruik voor een bestand de checksumtool die je besturingssysteem al meelevert: shasum -a 256 op macOS en Linux, of Get-FileHash in PowerShell op Windows. Beide berekenen dezelfde hash die deze pagina zou geven voor identieke bytes.