HMAC Generator
HMAC-Signaturen mit SHA-256, SHA-384 oder SHA-512 generieren
Nachricht
Geheimer Schlüssel
HMAC-Signatur
HMAC-Signatur wird hier angezeigt…
Was ist HMAC?
HMAC (Hash-based Message Authentication Code) ist eine kryptografische Konstruktion, die in RFC 2104 definiert ist und eine Hashfunktion mit einem geheimen Schlüssel kombiniert, um einen Authentication-Tag fester Länge zu erzeugen. Im Gegensatz zu einem einfachen Hash, den jeder berechnen kann, kann ein HMAC nur von Parteien erzeugt und verifiziert werden, die den geheimen Schlüssel kennen. HMAC ist der Standardmechanismus zur Prüfung von Integrität und Authentizität einer Nachricht — er bestätigt, dass die Daten nicht verändert wurden und von einem vertrauenswürdigen Absender stammen.
Der HMAC-Algorithmus funktioniert mit jeder iterativen Hashfunktion: SHA-256, SHA-384, SHA-512 und auch älteren Funktionen wie SHA-1 oder MD5. Das resultierende Konstrukt wird nach der verwendeten Hashfunktion benannt — HMAC-SHA256, HMAC-SHA384 oder HMAC-SHA512. Da der Sicherheitsbeweis von HMAC auf kollisionsresistenten Hashfunktionen mit bestimmten pseudozufälligen Eigenschaften beruht, sind SHA-2-Algorithmen die empfohlene Wahl für neue Systeme. HMAC-SHA256 ist die am häufigsten eingesetzte Variante, verwendet in AWS Signature V4, Stripe-Webhooks, GitHub-Webhook-Secrets, Slack Request Signing und JSON Web Tokens (HS256).
Das HMAC-Design bietet eine kritische Eigenschaft, die einfachem Hashing fehlt: Resistenz gegen Längenerweiterungsangriffe. Mit SHA-256 allein kann ein Angreifer, der H(Nachricht) kennt, H(Nachricht || Angreiferdaten) berechnen, ohne die ursprüngliche Nachricht zu kennen. HMACs doppelte Hashstruktur (innerer Hash und äußerer Hash mit unterschiedlich aufgefüllten Schlüsseln) verhindert diesen Angriff vollständig. Deshalb verwenden API-Signaturverfahren HMAC anstatt einen geheimen Schlüssel an die Nachricht anzuhängen und das Ergebnis zu hashen.
Warum einen Online-HMAC-Generator verwenden?
HMAC-Signaturen zu berechnen erfordert normalerweise Code oder CLI-Werkzeuge. Dieser browserbasierte HMAC-Generator ermöglicht es, HMAC-SHA256-, HMAC-SHA384- und HMAC-SHA512-Signaturen sofort zu erstellen — ohne Software zu installieren oder zum Terminal zu wechseln.
Anwendungsfälle des HMAC-Generators
HMAC vs. einfacher Hash vs. Verschlüsselung
HMAC, einfaches Hashing und Verschlüsselung dienen unterschiedlichen Zwecken. HMAC bietet Nachrichtenauthentifizierung — den Nachweis, dass die Nachricht von jemandem mit dem geheimen Schlüssel erstellt wurde und nicht verändert wurde. Ein einfacher Hash bietet Integrität, aber keine Authentifizierung. Verschlüsselung bietet Vertraulichkeit. Die folgende Tabelle verdeutlicht die Unterschiede.
| Eigenschaft | 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 |
HMAC-Algorithmenvergleich
HMAC kann jede Hashfunktion verwenden, aber die Wahl des zugrundeliegenden Algorithmus bestimmt Ausgabegröße, Sicherheitsniveau und Browser-Kompatibilität. HMAC-SHA256 ist die häufigste Wahl für neue Systeme. Die folgende Tabelle vergleicht die Varianten, denen man wahrscheinlich begegnet.
| Algorithmus | Digest-Größe | Hex-Länge | Web Crypto API | Geeignet für |
|---|---|---|---|---|
| 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 |
Wie HMAC intern funktioniert
HMAC wendet die zugrundeliegende Hashfunktion zweimal mit zwei verschiedenen schlüsselabgeleiteten Pads an. Die Konstruktion ist in RFC 2104 definiert und als PRF (pseudozufällige Funktion) unter Standardannahmen der Kryptografie bewiesen. Der Schlüssel wird zunächst aufgefüllt oder gehasht, um der Blockgröße der Hashfunktion zu entsprechen (64 Bytes für SHA-256, 128 Bytes für SHA-512).
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
Der Algorithmus XOR-verknüpft den aufgefüllten Schlüssel mit einer inneren Pad-Konstante (ipad, 0x36 wiederholt), verknüpft ihn mit der Nachricht und hasht das Ergebnis. Anschließend XOR-verknüpft er den aufgefüllten Schlüssel mit einer äußeren Pad-Konstante (opad, 0x5C wiederholt), verknüpft ihn mit der inneren Hash-Ausgabe und hasht erneut. Diese doppelte Hashstruktur verhindert Längenerweiterungsangriffe und stellt sicher, dass die HMAC-Ausgabe ohne Kenntnis des geheimen Schlüssels nicht berechnet werden kann.
HMAC Code-Beispiele
HMAC wird nativ in jeder gängigen Sprache und Laufzeitumgebung unterstützt. Die Web Crypto API stellt HMAC-SHA256, HMAC-SHA384 und HMAC-SHA512 in Browsern ohne Bibliothek bereit. Die folgenden Beispiele zeigen reale Verwendungsmuster einschließlich Webhook-Verifizierung und zeitkonstantem Vergleich.
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)"