HMAC Generator

HMAC-handtekeningen genereren met SHA-256, SHA-384 of SHA-512

Algoritme

Bericht

Draait lokaal · Veilig om secrets te plakken

Geheime sleutel

Draait lokaal · Veilig om secrets te plakken

HMAC-handtekening

HMAC-handtekening verschijnt hier…

Wat is HMAC?

HMAC (Hash-based Message Authentication Code) is een cryptografische constructie gedefinieerd in RFC 2104 die een hashfunctie combineert met een geheime sleutel om een authenticatietag van vaste grootte te produceren. In tegenstelling tot een gewone hash, die iedereen kan berekenen, kan een HMAC alleen worden gegenereerd en geverifieerd door partijen die de geheime sleutel delen. HMAC is het standaardmechanisme voor het verifiëren van zowel de integriteit als de authenticiteit van een bericht — het bevestigt dat de gegevens niet zijn gewijzigd en afkomstig zijn van een vertrouwde afzender.

Het HMAC-algoritme werkt met elke iteratieve hashfunctie: SHA-256, SHA-384, SHA-512 en ook oudere functies zoals SHA-1 of MD5. De resulterende constructie wordt aangeduid met de onderliggende hash — HMAC-SHA256, HMAC-SHA384 of HMAC-SHA512. Omdat het beveiligingsbewijs van HMAC afhankelijk is van botsingsresistentie en bepaalde pseudowillekeurige eigenschappen van de hashfunctie, zijn SHA-2-familie-algoritmen de aanbevolen keuze voor nieuwe systemen. HMAC-SHA256 is de meest gebruikte variant, toegepast in AWS Signature V4, Stripe-webhooks, GitHub-webhookgeheimen, Slack-aanvraagondertekening en JSON Web Tokens (HS256).

Het ontwerp van HMAC biedt een kritieke eigenschap die gewone hashing mist: weerstand tegen length-extension-aanvallen. Met alleen SHA-256 kan een aanvaller die H(bericht) kent, H(bericht || aanvaller_data) berekenen zonder het originele bericht te kennen. De dubbele hashstructuur van HMAC (interne hash en externe hash met verschillende gevulde sleutels) voorkomt deze aanval volledig. Daarom gebruiken API-handtekeningsschema's HMAC in plaats van een geheime sleutel aan het bericht toe te voegen en het resultaat te hashen.

Waarom een online HMAC Generator gebruiken?

HMAC-handtekeningen berekenen vereist doorgaans het schrijven van code of het gebruik van CLI-tools. Met deze browsergebaseerde HMAC Generator maak je direct HMAC-SHA256-, HMAC-SHA384- en HMAC-SHA512-handtekeningen zonder software te installeren of naar een terminal te wisselen.

Directe HMAC-berekening
Voer je bericht en geheime sleutel in, kies het hashalgoritme en ontvang de HMAC-handtekening onmiddellijk. De Web Crypto API verwerkt de berekening native in je browser.
🔒
Privacy-first verwerking
Je bericht en geheime sleutel verlaten je apparaat nooit. Alle HMAC-berekening verloopt lokaal via de Web Crypto API — geen serververzoeken, geen logging, geen dataopslag.
📋
Meerdere algoritmen ondersteund
Wissel met één klik tussen HMAC-SHA256, HMAC-SHA384 en HMAC-SHA512. Vergelijk uitvoer per algoritme om te controleren of je backend-implementatie overeenkomt.
🔍
Geen account of installatie
Werkt in elke moderne browser — Chrome, Firefox, Safari, Edge. Geen aanmelding, geen extensie, geen CLI-configuratie. Open de pagina en begin met het genereren van HMAC-handtekeningen.

Toepassingen van de HMAC Generator

Frontend Developer — Verificatie van webhookhandtekeningen
Stripe, GitHub en Shopify ondertekenen webhookpayloads met HMAC-SHA256. Gebruik dit hulpmiddel om de verwachte handtekening te berekenen op basis van een payload en een geheim, en vergelijk deze vervolgens met de handtekening in de HTTP-header tijdens ontwikkeling.
Backend Engineer — Ondertekening van API-verzoeken
AWS Signature V4 vereist HMAC-SHA256 in meerdere stappen van het ondertekeningsproces. Genereer referentie-HMAC-waarden tijdens ontwikkeling om ondertekeningsproblemen te debuggen en tussenliggende berekeningsstappen te verifiëren.
DevOps — Validatie bij sleutelrotatie
Bij het roteren van webhookgeheimen of API-ondertekeningssleutels, bereken HMAC-handtekeningen met zowel de oude als de nieuwe sleutel om te bevestigen dat je applicatie de overgang correct verwerkt voordat de oude sleutel verloopt.
QA Engineer — Testvektor voor handtekeningen
Genereer HMAC-testvectoren met bekende invoer en sleutels voor regressietests van je authenticatiemiddleware. Verifieer dat je implementatie lege berichten, Unicode-invoer en lange sleutels correct verwerkt.
Data Engineer — Berichtauthenticatie in pipelines
Voeg HMAC-handtekeningen toe aan berichten in event-driven pipelines (Kafka, SQS) om te verifiëren dat berichten niet zijn gemanipuleerd tijdens de overdracht tussen services.
Student — Cryptografie leren
Experimenteer met HMAC om te begrijpen hoe het wijzigen van één teken in het bericht of de sleutel een volledig andere handtekening oplevert. Vergelijk HMAC-uitvoer met gewone SHA-256-uitvoer om het verschil te zien dat een geheime sleutel introduceert.

HMAC vs gewone hash vs encryptie

HMAC, gewone hashing en encryptie dienen verschillende doeleinden. HMAC biedt berichtauthenticatie — bewijs dat het bericht is aangemaakt door iemand met de geheime sleutel en niet is gewijzigd. Een gewone hash biedt integriteit maar geen authenticatie. Encryptie biedt vertrouwelijkheid. De onderstaande tabel verduidelijkt de verschillen.

EigenschapHMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

Vergelijking van HMAC-algoritmen

HMAC kan elke hashfunctie gebruiken, maar de keuze van het onderliggende algoritme bepaalt de uitvoergrootte, het beveiligingsniveau en de browsercompatibiliteit. HMAC-SHA256 is de meest gebruikte keuze voor nieuwe systemen. De onderstaande tabel vergelijkt de varianten die je het meest zult tegenkomen.

AlgoritmeDigestgrootteHex-lengteWeb Crypto APIGeschikt voor
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

Hoe HMAC intern werkt

HMAC past de onderliggende hashfunctie tweemaal toe met twee verschillende sleutelafgeleide opvullingen. De constructie is gedefinieerd in RFC 2104 en bewezen een PRF (pseudowillekeurige functie) te zijn onder standaard cryptografische aannames. De sleutel wordt eerst opgevuld of gehasht zodat deze overeenkomt met de blokgrootte van de hashfunctie (64 bytes voor SHA-256, 128 bytes voor SHA-512).

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
where K' = key padded to block size, ipad = 0x36, opad = 0x5C

Het algoritme XOR't de opgevulde sleutel met een interne opvulconstante (ipad, 0x36 herhaald), voegt het bericht eraan toe en hasht het resultaat. Vervolgens XOR't het de opgevulde sleutel met een externe opvulconstante (opad, 0x5C herhaald), voegt de interne hash-uitvoer eraan toe en hasht opnieuw. Deze dubbele hashstructuur voorkomt length-extension-aanvallen en garandeert dat de HMAC-uitvoer niet kan worden berekend zonder kennis van de geheime sleutel.

HMAC codevoorbeelden

HMAC wordt native ondersteund in elke grote taal en runtime. De Web Crypto API biedt HMAC-SHA256, HMAC-SHA384 en HMAC-SHA512 in browsers zonder bibliotheek. De onderstaande voorbeelden tonen praktische gebruikspatronen, waaronder webhookverificatie en constant-time vergelijking.

JavaScript (Web Crypto API)
async function hmacSHA256(message, secret) {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
  return Array.from(new Uint8Array(sig))
    .map(b => b.toString(16).padStart(2, '0')).join('')
}

await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
  .update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
Python
import hmac
import hashlib

# HMAC-SHA256
sig = hmac.new(
    b'my-secret-key',
    b'hello world',
    hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
    print("Signature valid")

# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()
Go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "fmt"
)

func main() {
    mac := hmac.New(sha256.New, []byte("my-secret-key"))
    mac.Write([]byte("hello world"))
    sig := mac.Sum(nil)
    fmt.Printf("%x\n", sig)
    // → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

    // Verify: use hmac.Equal for constant-time comparison
    expected := mac.Sum(nil)
    fmt.Println(hmac.Equal(sig, expected)) // true
}
CLI (OpenSSL)
# HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key"
# → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

# HMAC-SHA512
echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key"

# Verify a file signature
openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz

# HMAC with hex key (e.g. from a webhook secret)
echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"

Veelgestelde vragen

Wat is het verschil tussen HMAC en een gewone hash?
Een gewone hash (SHA-256, MD5) neemt alleen een bericht als invoer en produceert een digest die iedereen kan berekenen. HMAC neemt zowel een bericht als een geheime sleutel en produceert een handtekening die alleen iemand met de sleutel kan genereren of verifiëren. Dit betekent dat HMAC naast integriteitscontrole ook authenticatie biedt (bewijs van de identiteit van de afzender). Een gewone hash bewijst alleen dat de gegevens niet zijn gewijzigd, niet wie ze heeft aangemaakt.
Is HMAC-SHA256 veilig?
Ja. HMAC-SHA256 wordt beschouwd als veilig per 2026. De beveiliging is gebaseerd op de pseudowillekeurige eigenschappen van SHA-256 en de HMAC-constructie zelf (RFC 2104). Er is geen praktische aanval tegen HMAC-SHA256 aangetoond. Zelfs HMAC-MD5 en HMAC-SHA1 blijven in de praktijk veilig, omdat de beveiliging van HMAC geen volledige botsingsresistentie van de onderliggende hash vereist — al worden SHA-2-varianten aanbevolen voor nieuwe systemen.
Waarom gebruiken webhooks HMAC in plaats van de payload te versleutelen?
Webhookpayloads bevatten doorgaans gegevens die de ontvanger al verwacht — bestelgegevens, gebeurtenismeldingen, statusupdates. Het doel is niet de gegevens te verbergen (vertrouwelijkheid), maar te bewijzen dat ze afkomstig zijn van de legitieme afzender en niet onderweg zijn gewijzigd (authenticiteit en integriteit). HMAC bereikt dit met minimale overhead: de afzender berekent een HMAC van de payload met een gedeeld geheim en voegt deze toe aan een HTTP-header. De ontvanger herberekent de HMAC en vergelijkt. Encryptie zou onnodige complexiteit en sleutelbeheer toevoegen.
Hoe vergelijk ik HMAC-handtekeningen veilig?
Gebruik altijd een constant-time vergelijkingsfunctie. In Python gebruik je hmac.compare_digest(). In Node.js gebruik je crypto.timingSafeEqual(). In Go gebruik je hmac.Equal(). Standaard stringvergelijkingsoperatoren (== of ===) kunnen timingsinformatie lekken: een aanvaller kan meten hoe lang de vergelijking duurt om vast te stellen hoeveel bytes van zijn vervalste handtekening overeenkomen met de juiste, en vervolgens de resterende bytes één voor één raden.
Kan HMAC worden omgekeerd om de geheime sleutel te achterhalen?
Nee. HMAC is gebaseerd op een eenrichtingshashfunctie, zodat er geen wiskundige snelkoppeling is om de sleutel uit een HMAC-uitvoer te extraheren. Een aanvaller zou de sleutelruimte bruut moeten doorzoeken, wat niet haalbaar is voor sleutels van 128 bits of langer. Zwakke of korte sleutels (zoals eenvoudige wachtwoorden) kunnen echter kwetsbaar zijn voor woordenboekaanvallen, dus gebruik altijd cryptografisch willekeurige sleutels van minimaal 256 bits voor HMAC-SHA256.
Wat gebeurt er als de HMAC-sleutel langer is dan de hashblokgrootte?
Als de geheime sleutel langer is dan de blokgrootte van de hashfunctie (64 bytes voor SHA-256, 128 bytes voor SHA-512), hasht het HMAC-algoritme de sleutel eerst met de onderliggende hashfunctie om deze te reduceren tot de hash-uitvoerlengte, en gebruikt die hash dan als effectieve sleutel. Dit betekent dat zeer lange sleutels geen extra beveiliging bieden voorbij de hash-uitvoergrootte. Voor HMAC-SHA256 worden sleutels langer dan 64 bytes gereduceerd tot 32 bytes en bieden ze geen beveiligingsvoordeel ten opzichte van een sleutel van 64 bytes; sleutels tot 64 bytes worden op volledige lengte gebruikt.
Wanneer moet ik HMAC-SHA512 gebruiken in plaats van HMAC-SHA256?
Gebruik HMAC-SHA512 wanneer het protocol dit vereist (sommige sleutelafleidingsfuncties zoals HKDF-SHA512, Ed25519-sleutelgeneratie), wanneer je een bredere handtekening wilt voor extra veiligheid, of wanneer je op 64-bits hardware draait waar SHA-512 feitelijk sneller is dan SHA-256. Voor de meeste webapplicaties, API-ondertekening en webhookverificatie biedt HMAC-SHA256 voldoende beveiliging en is het de meer gebruikelijke keuze in ecosystemen.