Skip to content

HMAC-generator en handtekeningverificatie

Gratis online HMAC-generator en -verificator. Bereken HMAC-SHA256/SHA1/SHA384/SHA512 met sleutels in Tekst, Hex of Base64 en Hex/Base64/Base64URL-uitvoer. 100% in je browser — sleutels verlaten nooit de pagina.

Geen tracking Draait in je browser Gratis
100% in je browser — je bericht en geheime sleutel verlaten nooit je apparaat.
Gegenereerde HMAC

Wat is een HMAC?

Een HMAC (Hash-based Message Authentication Code) is een korte tag van vaste lengte die bewijst dat een bericht zowel ongewijzigd als authentiek is — dat het is gemaakt door iemand die een gedeelde geheime sleutel bezit. Gedefinieerd in RFC 2104 en FIPS 198-1 combineert HMAC een willekeurige cryptografische hashfunctie met een geheime sleutel in een specifieke geneste constructie, geschreven als HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). De interne hash bindt de sleutel aan het bericht; de externe hash omhult het resultaat, en dat is wat HMAC bestand maakt tegen length-extension-aanvallen die de ruwe SHA-1- en SHA-256-functies treffen.

HMAC zit overal in moderne webinfrastructuur. Het ondertekent webhooks zodat je kunt bevestigen dat een binnenkomend verzoek echt van GitHub, Stripe, Slack of Twilio kwam en niet is vervalst. Het ondertekent API-verzoeken (AWS Signature Version 4 is gebouwd op HMAC-SHA256) zodat een server de aanroeper kan authenticeren zonder een wachtwoord over de lijn te sturen. Het is de S in HS256: een met HS256 ondertekende JWT draagt een HMAC-SHA256 over zijn header en payload, die je kunt inspecteren met de JWT-encoder. Het ligt ook ten grondslag aan TLS-sleutelderivatie (HKDF), eenmalig-wachtwoordalgoritmes (HOTP/TOTP) en berichtintegriteit in talloze interne services.

Deze tool berekent HMAC volledig in je browser met crypto.subtle.sign('HMAC', ...) uit de Web Crypto API — dezelfde primitieve die browsers gebruiken tijdens TLS-handshakes. Je geheime sleutel en bericht worden nooit geüpload, dus het is veilig voor productie-ondertekeningsgeheimen. Omdat hetzelfde geheim als ruwe tekst, hex of base64 kan worden uitgedrukt, laat de tool je de Sleutelcodering expliciet kiezen, en omdat verschillende providers de tag in verschillende vormen verwachten, kun je Hex, Base64 of Base64URL uitvoeren. Met het tabblad Verifiëren kun je een ontvangen handtekening controleren, met een vergelijking in constante tijd zodat de controle zelf geen timinginformatie lekt.

const crypto = require('crypto');

// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
  .createHmac('sha256', 'my-secret-key')
  .update('Hello, World!')
  .digest('hex');

console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'

// Verify a signature in constant time
function verify(message, key, expectedHex) {
  const actual = crypto.createHmac('sha256', key).update(message).digest();
  const expected = Buffer.from(expectedHex, 'hex');
  return actual.length === expected.length &&
    crypto.timingSafeEqual(actual, expected);
}

Belangrijkste functies

Genereren en verifiëren in één tool

Genereer een handtekening op het tabblad Genereren, of plak een verwachte HMAC op het tabblad Verifiëren om een binnenkomende webhook of token te authenticeren. Verificatie gebruikt een vergelijking in constante tijd zodat het resultaat nooit timinginformatie lekt.

Kies de sleutelcodering

Interpreteer je geheim als Tekst (UTF-8), Hexadecimaal of Base64. Dit is de instelling die de meeste andere tools weglaten — en de meest voorkomende reden waarom twee systemen verschillende HMAC's berekenen voor dezelfde sleutel.

Drie uitvoercoderingen

Voer de tag uit als Hex (GitHub-webhooks, AWS), Base64 (Stripe, Twilio, veel API's) of Base64URL (JWT's en URL-veilige tokens) zodat hij aansluit op je integratie zonder handmatige conversie.

Vier native algoritmes

HMAC-SHA256 standaard, plus SHA-1, SHA-384 en SHA-512. Alle draaien op de Web Crypto API van de browser, dus er is geen JavaScript-cryptobibliotheek om te vertrouwen en geen prestatieverlies.

100% client-side en privé

Je geheime sleutel en bericht worden volledig in je browser verwerkt en nooit naar een server gestuurd. Open het tabblad Netwerk en je ziet nul uitgaande verzoeken — veilig voor productie-ondertekeningsgeheimen.

Live berekening

De HMAC wordt direct herberekend terwijl je het bericht, de sleutel, de codering of het algoritme bewerkt — geen heen-en-weer van een Genereren-knop, zodat je met coderingen kunt experimenteren tot je waarde matcht met die van de server.

Gebouwd op geteste vectoren

De uitvoer is gevalideerd tegen de officiële HMAC-testvectoren van RFC 4231, zodat je erop kunt vertrouwen dat de digests overeenkomen met wat OpenSSL, de crypto-module van Node en de hmac-bibliotheek van Python produceren.

HMAC-voorbeelden

Snelle start — HMAC-SHA256, hex-uitvoer

Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699

Met sleutel "my-secret-key" (Sleutelcodering = Tekst), algoritme HMAC-SHA256 en Uitvoerformaat = Hex levert het bericht "Hello, World!" cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699 op. Dit is de canonieke hex-digest van 64 tekens die je krijgt uit crypto.createHmac('sha256', key).update(msg).digest('hex') van Node.

Een webhook in Stripe-stijl verifiëren (Base64-uitvoer)

{"id":42,"event":"user.created"}
Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=

Veel webhook-providers sturen de handtekening als Base64. Met sleutel "whsec_test_secret" (Tekst), HMAC-SHA256 en Uitvoerformaat = Base64 ondertekent de JSON-body tot Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Plak die waarde in het tabblad Verifiëren om te bevestigen dat het verzoek echt van je provider kwam voordat je het verwerkt. Intern draait HMAC op dezelfde primitieve als onze SHA-256-hashgenerator, maar dan met je geheim als sleutel.

RFC 4231-referentievector

what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843

Dit is testgeval 2 uit RFC 4231, het officiële document met HMAC-testvectoren. Met sleutel "Jefe" (Tekst), HMAC-SHA256 en Hex-uitvoer levert het bericht "what do ya want for nothing?" 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843 op. Exact deze waarde matchen is hoe je bewijst dat een HMAC-implementatie correct is.

HMAC-SHA512 voor een langere digest

The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e

Schakel het algoritme naar HMAC-SHA512 voor een digest van 128 tekens (512 bits). Met sleutel "key" (Tekst) en Hex-uitvoer levert "The quick brown fox" de waarde hierboven op. SHA-512 is sneller dan SHA-256 op de meeste 64-bits hardware en geeft een grotere uitvoer, al blijft SHA-256 de standaard voor interoperabiliteit.

Een HMAC genereren en verifiëren

  1. 1

    Kies het algoritme

    Kies HMAC-SHA256 (de standaard en de juiste keuze voor vrijwel alle webhooks, API's en JWT's), of schakel over naar SHA-1, SHA-384 of SHA-512 om aan te sluiten op een systeem dat dat vereist. Alle vier draaien native in je browser via de Web Crypto API.

  2. 2

    Voer de geheime sleutel in en stel de codering in

    Typ of plak je geheime sleutel en stel de Sleutelcodering in zodat die overeenkomt met hoe de server hem interpreteert: Tekst (UTF-8) voor een gewone string, Hex voor een hexadecimale blob, of Base64 voor een base64-geheim. Dit fout instellen is de belangrijkste oorzaak van HMAC-verschillen, dus bij twijfel probeer je alle drie.

  3. 3

    Voer het bericht in

    Plak de exacte bytes die je wilt ondertekenen — voor een webhook is dat de ruwe verzoekbody, byte voor byte, zonder her-serialisatie of wijzigingen in witruimte. De HMAC wordt live herberekend terwijl je bewerkt, zonder dat er iets naar een server wordt gestuurd.

  4. 4

    Kies het uitvoerformaat en kopieer

    Selecteer Hex (GitHub-stijl), Base64 (Stripe/AWS-stijl) of Base64URL (JWT-stijl) om aan te sluiten op wat je integratie verwacht, en klik dan op Kopiëren om de handtekening over te nemen.

  5. 5

    Verifieer een bestaande handtekening

    Schakel naar het tabblad Verifiëren, plak de verwachte HMAC uit een header of token, en de tool bevestigt in constante tijd of je berekende handtekening matcht — zodat je een payload kunt authenticeren voordat je erop reageert.

Veelgemaakte HMAC-fouten

Sleutelcodering komt niet overeen (oorzaak nr. 1 van verschillen)

Hetzelfde geheim kan worden gelezen als ruwe UTF-8-tekst, als hex of als base64 — en elke interpretatie levert volledig andere sleutelbytes op, dus de HMAC matcht niet als jouw tool en de server het oneens zijn. Als een provider je een hex- of base64-geheim geeft, moet je het naar bytes decoderen voordat je ondertekent, en niet de string zelf ondertekenen. Wanneer een handtekening de verificatie niet doorstaat, probeer de sleutel dan eerst onder alle drie de Sleutelcodering-opties.

✗ Fout
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg)
✓ Correct
// Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg)

Uitvoercodering komt niet overeen

Een HMAC is ruwe bytes; hex, base64 en base64url zijn slechts verschillende tekstcoderingen van dezelfde waarde. Als de server een base64-handtekening stuurt en je vergelijkt die met je hex-digest, matchen ze nooit ook al zijn de onderliggende bytes identiek. Laat het Uitvoerformaat overeenkomen met wat de header of token gebruikt.

✗ Fout
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual   = digest('hex') // hex — never matches
✓ Correct
// Produce the same encoding the provider uses
actual = digest('base64')

Her-geserialiseerde JSON ondertekenen in plaats van de ruwe body

Webhook-handtekeningen dekken de exacte bytes die de provider stuurde. Als je de JSON parset en opnieuw stringify't, kunnen de sleutelvolgorde, spatiëring en getalopmaak veranderen, waardoor de bytes wijzigen en de handtekening breekt. Maak altijd de HMAC van de ruwe verzoekbody die vóór elke parsing is vastgelegd.

✗ Fout
// Re-serialization changes the bytes
body = JSON.stringify(JSON.parse(rawBody))
verify(hmac(body))
✓ Correct
// Sign the raw bytes exactly as received
verify(hmac(rawBody))

== gebruiken in plaats van een vergelijking in constante tijd

De ontvangen handtekening vergelijken met == of eenvoudige stringgelijkheid lekt timinginformatie, omdat de vergelijking stopt bij de eerste afwijkende byte. Over veel pogingen kan een aanvaller een geldige tag achterhalen. Gebruik bij het verifiëren altijd een gelijkheidscontrole in constante tijd.

✗ Fout
if (received === computed) { /* trust */ }
✓ Correct
if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ }

Waarvoor HMAC wordt gebruikt

Webhook-handtekeningen verifiëren
Providers als GitHub, Stripe, Slack en Twilio ondertekenen elke webhook met HMAC over de verzoekbody en een geheim dat alleen jij deelt. Herbereken de tag en vergelijk hem met de header (bijvoorbeeld X-Hub-Signature-256) om te bevestigen dat de gebeurtenis echt is voordat je erop reageert. Gebruik het tabblad Verifiëren om dit te doen zonder wegwerpcode te schrijven.
API-verzoeken ondertekenen
Geauthenticeerde API's vereisen vaak dat de client het verzoek met HMAC ondertekent (methode, pad, timestamp, body) met een gedeeld geheim in plaats van het geheim zelf te versturen. AWS Signature Version 4 is het canonieke voorbeeld. Met deze tool kun je die handtekeningen stap voor stap reproduceren en debuggen.
Berichtintegriteit garanderen
Wanneer je een token, cookie of bericht tussen services doorgeeft, laat een bijgevoegde HMAC de ontvanger elke manipulatie detecteren. Omdat de tag van een geheim afhangt, kan een aanvaller hem niet herberekenen na het wijzigen van de data — anders dan bij een gewone checksum.
JWT HS256-ondertekening begrijpen
Een met HS256 ondertekende JWT is gewoon base64url(header) + '.' + base64url(payload), ondertekend met HMAC-SHA256 en het resultaat uitgegeven als Base64URL. Zet het algoritme op SHA-256 en de uitvoer op Base64URL hier om precies te zien hoe die handtekening tot stand komt, en controleer het dan in de JWT-encoder.
Een niet-matchende handtekening debuggen
Wanneer je HMAC niet matcht met die van de server, is deze tool de snelste manier om te isoleren waarom: probeer de sleutel als Tekst, Hex en Base64, wissel de uitvoer tussen Hex en Base64, en bevestig dat je precies de ruwe bytes ondertekent — allemaal zonder code opnieuw te deployen.

Hoe HMAC werkt

RFC 2104-constructie
HMAC is gedefinieerd als H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), waarbij ipad de byte 0x36 herhaald is en opad 0x5c herhaald, beide tot de blokgrootte van de hash. Een sleutel langer dan de blokgrootte wordt eerst gehasht; een kortere sleutel wordt met nullen opgevuld. Deze nesting met twee passes is wat HMAC zijn beveiligingsbewijs geeft, dat geldt zelfs als de onderliggende hash niet botsingsbestendig is.
Waarom een gesleutelde hash een gewone hash verslaat
Een gewone hash bewijst alleen dat data niet per ongeluk beschadigd is, want iedereen kan hem herberekenen voor elk bericht — ook een gemanipuleerd. HMAC mengt er een geheim doorheen, zodat alleen sleutelhouders een geldige tag kunnen produceren. Dat verandert alleen-integriteit in integriteit plus authenticiteit, precies de eigenschap die webhooks en ondertekende verzoeken nodig hebben.
Bestendigheid tegen length-extension
Kale SHA-1, SHA-256 en SHA-512 zijn Merkle–Damgård-hashes die kwetsbaar zijn voor length-extension: gegeven H(geheim ‖ msg) kan een aanvaller H(geheim ‖ msg ‖ extra) berekenen zonder het geheim te kennen. Naïeve 'secret-prefix MAC'-schema's worden hierdoor gebroken. De externe hash van HMAC neutraliseert de aanval, en dat is de belangrijkste reden om HMAC te gebruiken in plaats van een geheim en bericht samen te hashen.
SHA-256 versus SHA-512 kiezen
HMAC-SHA256 produceert een tag van 256 bits (64 hex-tekens) en is de standaard voor interoperabiliteit — snel, alomtegenwoordig en overal ondersteund. HMAC-SHA512 produceert een tag van 512 bits (128 hex-tekens) en is vaak sneller op 64-bits CPU's omdat SHA-512 64-bits woorden gebruikt. Kies SHA-256 tenzij een specificatie of partnersysteem SHA-512 vereist; beide zijn veilig voor authenticatie.
Web Crypto-implementatie
Deze tool roept crypto.subtle.importKey aan om je sleutel te laden (gedecodeerd uit Tekst, Hex of Base64) en crypto.subtle.sign('HMAC', ...) om de tag te berekenen, en codeert daarna de ruwe bytes als Hex, Base64 of Base64URL. Het is dezelfde native, geauditeerde implementatie die de browser voor TLS gebruikt, draaiend buiten de JavaScript-engine voor snelheid.

HMAC-best practices

Gebruik een sleutel minstens zo lang als de hash-uitvoer
Voor HMAC-SHA256 gebruik je een geheim van minstens 32 willekeurige bytes (256 bits); voor SHA-512 gebruik je er 64. Een korte sleutel of een sleutel met weinig entropie is de zwakste schakel. Genereer sleutels uit een cryptografisch veilige willekeurige bron — nooit een wachtwoord of een voorspelbare string.
Vergelijk tags altijd in constante tijd
Verifieer handtekeningen met een vergelijking in constante tijd (crypto.timingSafeEqual in Node, hmac.compare_digest in Python) in plaats van == of stringgelijkheid. Een naïeve vergelijking stopt vroeg bij de eerste afwijkende byte en lekt timing waarmee een aanvaller een geldige tag byte voor byte kan achterhalen. Het tabblad Verifiëren van deze tool vergelijkt al in constante tijd.
Log of toon de geheime sleutel nooit
Houd ondertekeningsgeheimen buiten logs, foutmeldingen, URL's en client-side code. Sla ze op in een secrets-manager of omgevingsvariabelen, roteer ze periodiek en geef elke integratie zijn eigen sleutel zodat één lek niet alles compromitteert.
Geef de voorkeur aan HMAC-SHA256 of sterker
Gebruik standaard HMAC-SHA256; stap op naar SHA-384 of SHA-512 wanneer een partner dat vereist. Vermijd HMAC-SHA1 voor nieuwe systemen en gebruik nooit HMAC-MD5. Ook al verdraagt HMAC een zwakkere hash beter dan een kale handtekening zou doen, starten met een moderne hash geeft je de meeste marge.
Onderteken de exacte bytes, inclusief een timestamp
Onderteken de ruwe, ongewijzigde payload — JSON her-serialiseren of witruimte bijsnijden verandert de bytes en breekt de verificatie. Neem voor verzoekondertekening een timestamp of nonce op in de ondertekende data en weiger verouderde handtekeningen om replay-aanvallen te voorkomen.

Veelgestelde vragen over HMAC

Wat is HMAC?
HMAC (Hash-based Message Authentication Code) is een manier om zowel de integriteit als de authenticiteit van een bericht aan te tonen met een gedeelde geheime sleutel. Je voert een bericht en een geheime sleutel in een hashfunctie (hier SHA-1, SHA-256, SHA-384 of SHA-512) volgens de specifieke geneste constructie uit RFC 2104, en je krijgt een tag van vaste lengte. Iedereen die het geheim kent, kan de tag herberekenen en bevestigen dat het bericht niet is gewijzigd en afkomstig is van iemand die de sleutel bezit. Het is het standaardmechanisme achter webhook-handtekeningen, ondertekende API-verzoeken en de HS256-familie van JWT-tokens.
Hoe verschilt HMAC van een gewone hash zoals SHA-256?
Een gewone hash zoals SHA-256 bewijst alleen integriteit: iedereen kan hem herberekenen, dus iedereen kan ook een passende hash vervalsen voor een gemanipuleerd bericht. HMAC mengt er een geheime sleutel doorheen, zodat alleen partijen die die sleutel bezitten een geldige tag kunnen produceren of verifiëren — dat voegt authenticiteit toe boven op integriteit. HMAC gebruikt ook een geneste constructie met twee passes (interne en externe hashing met van de sleutel afgeleide pads) die het immuun maakt voor de length-extension-aanvallen die ruwe SHA-1 en SHA-256 treffen. Kort gezegd: gebruik een hash om onbedoelde corruptie te detecteren, gebruik HMAC om opzettelijke manipulatie te detecteren door een aanvaller die je sleutel niet kent.
Hoe verifieer ik een binnenkomende webhook-handtekening?
Neem de ruwe verzoekbody precies zoals ontvangen (her-serialiseer de JSON niet — zelfs herschikte sleutels breken de handtekening), selecteer hetzelfde algoritme dat je provider gebruikt (meestal HMAC-SHA256), voer je ondertekeningsgeheim in met de juiste Sleutelcodering en stel het Uitvoerformaat in zodat het overeenkomt met de header (Hex voor het sha256=-voorvoegsel van GitHub, Base64 voor headers in Stripe/Twilio-stijl). Open daarna het tabblad Verifiëren, plak de handtekening uit de header (zoals X-Hub-Signature-256), en de tool meldt match of geen match met een vergelijking in constante tijd. Vertrouw de payload alleen als hij matcht.
Welke sleutel- en uitvoercodering gebruikt mijn server?
Er is geen universeel antwoord — het hangt af van je provider, en precies daarom biedt deze tool beide als expliciete keuzes. Veelvoorkomende patronen: GitHub gebruikt een UTF-8-tekstgeheim en kleine-letters hex-uitvoer met een sha256=-voorvoegsel; Stripe gebruikt een tekstgeheim en base64; AWS Signature V4 gebruikt afgeleide binaire sleutels en hex; veel interne systemen geven base64- of hex-geheimen uit die naar ruwe bytes gedecodeerd moeten worden voordat je ondertekent. Als je HMAC niet matcht, is de codering vrijwel altijd de boosdoener — probeer dezelfde sleutel onder Tekst, Hex en Base64 om de interpretatie te vinden die de server verwacht.
Is HMAC-SHA256 veilig?
Ja. HMAC-SHA256 wordt algemeen als veilig beschouwd en is de aanbevolen standaard voor berichtauthenticatie. De veiligheid komt voort uit de HMAC-constructie plus een sterke onderliggende hash, en blijft veilig ook al bestaan er collision-aanvallen tegen de kale hash — HMAC steunt niet op botsingsbestendigheid zoals een digitale handtekening dat doet. De echte risico's zijn operationeel, niet algoritmisch: een zwakke of gelekte geheime sleutel, de sleutel loggen, of een vergelijking gebruiken die niet in constante tijd werkt. Gebruik een lange willekeurige sleutel, vergelijk tags in constante tijd, en HMAC-SHA256 houdt stand.
Waarom geen HMAC-MD5 of HMAC-SHA-3 hier?
Bewust ontworpen. Deze tool biedt alleen SHA-1, SHA-256, SHA-384 en SHA-512 omdat dat de hashfuncties zijn die de native Web Crypto API van de browser ondersteunt, wat alles snel en volledig client-side houdt zonder extra bibliotheken. HMAC-MD5 is weggelaten omdat MD5 verouderd is en je er geen nieuwe systemen mee zou moeten beginnen. HMAC-SHA-3 is weggelaten omdat Web Crypto SHA-3 niet implementeert; het toevoegen zou betekenen dat je een JavaScript-polyfill moet meeleveren. Voor vrijwel alle moderne use-cases is HMAC-SHA256 sowieso de juiste keuze.
HS256 (HMAC) versus RS256 (RSA) — welke gebruik ik voor JWT's?
HS256 ondertekent en verifieert een JWT met één gedeeld geheim via HMAC-SHA256, terwijl RS256 ondertekent met een RSA-privésleutel en verifieert met de bijbehorende publieke sleutel. Gebruik HS256 wanneer één partij de tokens zowel uitgeeft als valideert (een monoliet, of vertrouwde interne services die het geheim veilig kunnen delen) — het is eenvoudiger en sneller. Gebruik RS256 wanneer derden of veel services tokens moeten verifiëren maar ze niet mogen kunnen aanmaken, omdat je dan alleen de publieke sleutel kunt verspreiden. Je kunt de gecodeerde structuur van beide verkennen in de JWT-encoder; de HS256-handtekening is precies een HMAC-SHA256 over de header en payload.

Gerelateerde tools

Alle tools bekijken →