HMAC Generator
HMAC-handtekeningen genereren met SHA-256, SHA-384 of SHA-512
Bericht
Geheime sleutel
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.
Toepassingen van de HMAC Generator
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.
| Eigenschap | HMAC | Plain Hash | Encryption |
|---|---|---|---|
| Purpose | Message authentication + integrity | Data integrity only (no key) | Confidentiality + integrity |
| Requires secret key | Yes | No | Yes |
| Verifiable by | Parties who share the secret | Anyone | Recipient with key |
| Reversible | No — digest only | No — digest only | Yes — decryption recovers data |
| Output size | Depends on hash (e.g. 256 bits) | Depends on hash | Variable (ciphertext) |
| Standard | RFC 2104 | FIPS 180-4 | NIST SP 800-38A (AES) |
| Use case example | Webhook signature verification | File checksum verification | Encrypting 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.
| Algoritme | Digestgrootte | Hex-lengte | Web Crypto API | Geschikt voor |
|---|---|---|---|---|
| HMAC-SHA256 | 256 bits | 64 hex chars | Yes | API signing, webhooks, JWT (HS256) |
| HMAC-SHA384 | 384 bits | 96 hex chars | Yes | TLS 1.3 PRF, CNSA compliance |
| HMAC-SHA512 | 512 bits | 128 hex chars | Yes | High-security signatures, HKDF |
| HMAC-SHA1 | 160 bits | 40 hex chars | Yes | Legacy OAuth 1.0, TOTP (RFC 6238) |
| HMAC-MD5 | 128 bits | 32 hex chars | No | Legacy 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).
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.
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"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()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
}# 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)"