Skip to content

HMAC-Generator & Signaturprüfer

Kostenloser HMAC-Generator und -Prüfer online. Berechne HMAC-SHA256/SHA1/SHA384/SHA512 mit Schlüsseln als Text, Hex oder Base64 und Ausgabe als Hex/Base64/Base64URL. 100 % in deinem Browser — Schlüssel verlassen nie die Seite.

Kein Tracking Läuft im Browser Kostenlos
100 % in deinem Browser — deine Nachricht und dein geheimer Schlüssel verlassen nie dein Gerät.
Generierter HMAC

Was ist ein HMAC?

Ein HMAC (Hash-based Message Authentication Code) ist ein kurzes Tag mit fester Länge, das beweist, dass eine Nachricht sowohl unverändert als auch authentisch ist — dass sie von jemandem erzeugt wurde, der einen gemeinsamen geheimen Schlüssel besitzt. In RFC 2104 und FIPS 198-1 definiert, kombiniert HMAC jede kryptografische Hash-Funktion mit einem geheimen Schlüssel in einer bestimmten geschachtelten Konstruktion, geschrieben als HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Der innere Hash bindet den Schlüssel an die Nachricht; der äußere Hash umschließt das Ergebnis, was HMAC widerstandsfähig gegen Längenerweiterungsangriffe macht, die die rohen SHA-1- und SHA-256-Funktionen betreffen.

HMAC ist überall in der modernen Web-Infrastruktur. Er signiert Webhooks, sodass du bestätigen kannst, dass eine eingehende Anfrage wirklich von GitHub, Stripe, Slack oder Twilio stammt und nicht gefälscht wurde. Er signiert API-Anfragen (AWS Signature Version 4 baut auf HMAC-SHA256 auf), sodass ein Server den Aufrufer authentifizieren kann, ohne ein Passwort über die Leitung zu senden. Er ist das S in HS256: Ein mit HS256 signiertes JWT trägt einen HMAC-SHA256 über seinen Header und seine Nutzlast, den du mit dem JWT-Kodierer untersuchen kannst. Er liegt auch der TLS-Schlüsselableitung (HKDF), den Einmalpasswort-Algorithmen (HOTP/TOTP) und der Nachrichtenintegrität in unzähligen internen Diensten zugrunde.

Dieses Tool berechnet HMAC vollständig in deinem Browser mit crypto.subtle.sign('HMAC', ...) aus der Web-Crypto-API — derselben Primitive, die Browser bei TLS-Handshakes verwenden. Dein geheimer Schlüssel und deine Nachricht werden nie hochgeladen, daher ist es sicher für produktive Signaturgeheimnisse. Da dasselbe Geheimnis als rohem Text, Hex oder Base64 ausgedrückt werden kann, lässt dich das Tool die Schlüsselkodierung explizit wählen, und da verschiedene Anbieter das Tag in unterschiedlichen Formen erwarten, kannst du es als Hex, Base64 oder Base64URL ausgeben. Der Tab Prüfen lässt dich eine empfangene Signatur kontrollieren, mithilfe eines Vergleichs in konstanter Zeit, sodass die Prüfung selbst keine Zeitinformationen preisgibt.

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);
}

Hauptfunktionen

Generieren und prüfen in einem Tool

Generiere eine Signatur im Tab Generieren oder füge einen erwarteten HMAC im Tab Prüfen ein, um einen eingehenden Webhook oder ein Token zu authentifizieren. Die Prüfung verwendet einen Vergleich in konstanter Zeit, sodass das Ergebnis nie Zeitinformationen preisgibt.

Die Schlüsselkodierung wählen

Interpretiere dein Geheimnis als Text (UTF-8), Hexadezimal oder Base64. Das ist die Einstellung, die die meisten anderen Tools auslassen — und der häufigste Grund, warum zwei Systeme für denselben Schlüssel unterschiedliche HMACs berechnen.

Drei Ausgabekodierungen

Gib das Tag als Hex (GitHub-Webhooks, AWS), Base64 (Stripe, Twilio, viele APIs) oder Base64URL (JWTs und URL-sichere Token) aus, damit es ohne manuelle Umwandlung zu deiner Integration passt.

Vier native Algorithmen

HMAC-SHA256 als Standard, dazu SHA-1, SHA-384 und SHA-512. Alle laufen über die Web-Crypto-API des Browsers, sodass es keiner JavaScript-Krypto-Bibliothek zu vertrauen gilt und keine Leistungseinbuße entsteht.

100 % clientseitig und privat

Dein geheimer Schlüssel und deine Nachricht werden vollständig in deinem Browser verarbeitet und nie an einen Server gesendet. Öffne den Netzwerk-Tab und du siehst null ausgehende Anfragen — sicher für produktive Signaturgeheimnisse.

Live-Berechnung

Der HMAC wird sofort neu berechnet, während du Nachricht, Schlüssel, Kodierung oder Algorithmus bearbeitest — kein Hin und Her über einen Generieren-Button, sodass du mit Kodierungen experimentieren kannst, bis dein Wert dem des Servers entspricht.

Auf geprüften Vektoren aufgebaut

Die Ausgabe wird gegen die offiziellen HMAC-Testvektoren aus RFC 4231 validiert, sodass du darauf vertrauen kannst, dass die Digests dem entsprechen, was OpenSSL, das crypto-Modul von Node und die hmac-Bibliothek von Python erzeugen.

HMAC-Beispiele

Schnellstart — HMAC-SHA256, Hex-Ausgabe

Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699

Mit dem Schlüssel „my-secret-key“ (Schlüsselkodierung = Text), dem Algorithmus HMAC-SHA256 und Ausgabeformat = Hex erzeugt die Nachricht „Hello, World!“ cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. Das ist der kanonische 64-stellige Hex-Digest, den du mit crypto.createHmac('sha256', key).update(msg).digest('hex') von Node erhältst.

Einen Webhook im Stripe-Stil prüfen (Base64-Ausgabe)

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

Viele Webhook-Anbieter senden die Signatur als Base64. Mit dem Schlüssel „whsec_test_secret“ (Text), HMAC-SHA256 und Ausgabeformat = Base64 wird der JSON-Body zu Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs= signiert. Füge diesen Wert in den Tab Prüfen ein, um zu bestätigen, dass die Anfrage wirklich von deinem Anbieter stammt, bevor du sie verarbeitest. Intern läuft HMAC über dieselbe Primitive wie unser SHA-256-Hash-Generator, jedoch mit deinem Geheimnis als Schlüssel.

RFC-4231-Referenzvektor

what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843

Dies ist Testfall 2 aus RFC 4231, dem offiziellen Dokument der HMAC-Testvektoren. Mit dem Schlüssel „Jefe“ (Text), HMAC-SHA256 und Hex-Ausgabe ergibt die Nachricht „what do ya want for nothing?“ 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Diesen exakten Wert zu reproduzieren ist die Art, wie du nachweist, dass eine HMAC-Implementierung korrekt ist.

HMAC-SHA512 für einen längeren Digest

The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e

Stelle den Algorithmus auf HMAC-SHA512 um, um einen 128-stelligen (512-Bit) Digest zu erhalten. Mit dem Schlüssel „key“ (Text) und Hex-Ausgabe erzeugt „The quick brown fox“ den Wert oben. SHA-512 ist auf den meisten 64-Bit-Systemen schneller als SHA-256 und liefert eine größere Ausgabe, wenngleich SHA-256 der Standard für Interoperabilität bleibt.

So generierst & prüfst du einen HMAC

  1. 1

    Den Algorithmus wählen

    Wähle HMAC-SHA256 (die Standardeinstellung und die richtige Wahl für nahezu alle Webhooks, APIs und JWTs) oder wechsle zu SHA-1, SHA-384 oder SHA-512, um einem System zu entsprechen, das es erfordert. Alle vier laufen nativ in deinem Browser über die Web-Crypto-API.

  2. 2

    Den geheimen Schlüssel eingeben und seine Kodierung festlegen

    Tippe oder füge deinen geheimen Schlüssel ein und stelle dann die Schlüsselkodierung passend dazu ein, wie der Server ihn interpretiert: Text (UTF-8) für eine einfache Zeichenkette, Hex für einen hexadezimalen Block oder Base64 für ein Base64-Geheimnis. Hier einen Fehler zu machen ist die häufigste Ursache für HMAC-Abweichungen, also probiere im Zweifel alle drei.

  3. 3

    Die Nachricht eingeben

    Füge die exakten Bytes ein, die du signieren willst — bei einem Webhook ist das der rohe Anfragetext, Byte für Byte, ohne Neuserialisierung oder Leerzeichenänderungen. Der HMAC wird live beim Bearbeiten neu berechnet, ohne dass etwas an einen Server gesendet wird.

  4. 4

    Das Ausgabeformat wählen und kopieren

    Wähle Hex (GitHub-Stil), Base64 (Stripe/AWS-Stil) oder Base64URL (JWT-Stil) passend zu dem, was deine Integration erwartet, und klicke dann auf Kopieren, um die Signatur zu übernehmen.

  5. 5

    Eine vorhandene Signatur prüfen

    Wechsle zum Tab Prüfen, füge den erwarteten HMAC aus einem Header oder Token ein, und das Tool bestätigt in konstanter Zeit, ob deine berechnete Signatur übereinstimmt — so kannst du eine Nutzlast authentifizieren, bevor du darauf reagierst.

Häufige HMAC-Fehler

Falsche Schlüsselkodierung (Ursache Nr. 1 für Abweichungen)

Dasselbe Geheimnis kann als roher UTF-8-Text, als Hex oder als Base64 gelesen werden — und jede Interpretation erzeugt völlig unterschiedliche Schlüssel-Bytes, sodass der HMAC nicht übereinstimmt, wenn dein Tool und der Server sich uneinig sind. Wenn ein Anbieter dir ein Hex- oder Base64-Geheimnis gibt, musst du es vor dem Signieren in Bytes dekodieren und nicht die Zeichenkette so wie sie ist signieren. Wenn eine Signatur die Prüfung nicht besteht, probiere zuerst den Schlüssel mit allen drei Schlüsselkodierungs-Optionen.

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

Falsche Ausgabekodierung

Ein HMAC sind rohe Bytes; Hex, Base64 und Base64URL sind nur unterschiedliche Textkodierungen desselben Werts. Wenn der Server eine Base64-Signatur sendet und du sie mit deinem Hex-Digest vergleichst, werden sie nie übereinstimmen, obwohl die zugrunde liegenden Bytes identisch sind. Passe das Ausgabeformat an das an, was der Header oder das Token verwendet.

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

Neuserialisiertes JSON statt des rohen Bodys signieren

Webhook-Signaturen decken die exakten Bytes ab, die der Anbieter gesendet hat. Wenn du das JSON parst und neu stringifizierst, können sich Schlüsselreihenfolge, Abstände und Zahlenformatierung ändern, was die Bytes verändert und die Signatur zerstört. Signiere immer den rohen Anfragetext, der vor jeglichem Parsen erfasst wurde.

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

== statt eines Vergleichs in konstanter Zeit verwenden

Die empfangene Signatur mit == oder einfacher String-Gleichheit zu vergleichen gibt Zeitinformationen preis, weil der Vergleich beim ersten abweichenden Byte stoppt. Über viele Versuche kann ein Angreifer ein gültiges Tag rekonstruieren. Verwende bei der Prüfung immer eine Gleichheitsprüfung in konstanter Zeit.

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

Wofür HMAC verwendet wird

Webhook-Signaturen prüfen
Anbieter wie GitHub, Stripe, Slack und Twilio signieren jeden Webhook mit einem HMAC über den Anfragetext und einem Geheimnis, das nur du teilst. Berechne das Tag neu und vergleiche es mit dem Header (zum Beispiel X-Hub-Signature-256), um zu bestätigen, dass das Ereignis echt ist, bevor du darauf reagierst. Verwende den Tab Prüfen, um das ohne Wegwerf-Code zu erledigen.
API-Anfragen signieren
Authentifizierte APIs verlangen oft, dass der Client die Anfrage per HMAC signiert (Methode, Pfad, Zeitstempel, Body) mit einem gemeinsamen Geheimnis, statt das Geheimnis selbst zu senden. AWS Signature Version 4 ist das kanonische Beispiel. Dieses Tool lässt dich solche Signaturen Schritt für Schritt reproduzieren und debuggen.
Nachrichtenintegrität garantieren
Wenn du ein Token, ein Cookie oder eine Nachricht zwischen Diensten weitergibst, lässt das Anhängen eines HMAC den Empfänger jede Manipulation erkennen. Da das Tag von einem Geheimnis abhängt, kann ein Angreifer es nach dem Ändern der Daten nicht neu berechnen — anders als eine einfache Prüfsumme.
Die JWT-HS256-Signierung verstehen
Ein mit HS256 signiertes JWT ist einfach base64url(Header) + '.' + base64url(Nutzlast), signiert mit HMAC-SHA256, wobei das Ergebnis als Base64URL ausgegeben wird. Stelle hier den Algorithmus auf SHA-256 und die Ausgabe auf Base64URL, um genau zu sehen, wie diese Signatur erzeugt wird, und gleiche es dann im JWT-Kodierer ab.
Eine nicht übereinstimmende Signatur debuggen
Wenn dein HMAC nicht mit dem des Servers übereinstimmen will, ist dieses Tool der schnellste Weg, die Ursache einzugrenzen: Probiere den Schlüssel als Text, Hex und Base64, wechsle die Ausgabe zwischen Hex und Base64 und bestätige, dass du genau die rohen Bytes signierst — alles ohne erneutes Deployment.

Wie HMAC funktioniert

RFC-2104-Konstruktion
HMAC ist definiert als H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), wobei ipad das wiederholte Byte 0x36 und opad das wiederholte 0x5c ist, beide bis zur Blockgröße des Hashes. Ein Schlüssel, der länger als die Blockgröße ist, wird zuerst gehasht; ein kürzerer Schlüssel wird mit Nullen aufgefüllt. Diese Zwei-Pass-Schachtelung verleiht HMAC seinen Sicherheitsbeweis, der selbst dann gilt, wenn der zugrunde liegende Hash nicht kollisionsresistent ist.
Warum ein schlüsselbasierter Hash einen reinen Hash schlägt
Ein reiner Hash beweist nur, dass Daten nicht versehentlich beschädigt wurden, denn jeder kann ihn für jede Nachricht neu berechnen — auch für eine manipulierte. HMAC mischt ein Geheimnis hinein, sodass nur Schlüsselinhaber ein gültiges Tag erzeugen können. Das verwandelt reine Integrität in Integrität plus Authentizität, also genau die Eigenschaft, die Webhooks und signierte Anfragen tatsächlich brauchen.
Resistenz gegen Längenerweiterung
Nacktes SHA-1, SHA-256 und SHA-512 sind Merkle–Damgård-Hashes, die anfällig für Längenerweiterung sind: Aus H(secret ‖ msg) kann ein Angreifer H(secret ‖ msg ‖ extra) berechnen, ohne das Geheimnis zu kennen. Naive „Secret-Prefix-MAC“-Schemata werden dadurch gebrochen. Der äußere Hash von HMAC neutralisiert den Angriff, was der Hauptgrund ist, HMAC zu verwenden, statt ein Geheimnis und eine Nachricht zusammen zu hashen.
SHA-256 vs. SHA-512 wählen
HMAC-SHA256 erzeugt ein 256-Bit-Tag (64 Hex-Zeichen) und ist der Standard für Interoperabilität — schnell, allgegenwärtig und überall unterstützt. HMAC-SHA512 erzeugt ein 512-Bit-Tag (128 Hex-Zeichen) und ist auf 64-Bit-CPUs oft schneller, weil SHA-512 64-Bit-Wörter verwendet. Wähle SHA-256, sofern keine Spezifikation oder kein Gegenstellen-System SHA-512 verlangt; beide sind für die Authentifizierung sicher.
Web-Crypto-Implementierung
Dieses Tool ruft crypto.subtle.importKey auf, um deinen Schlüssel zu laden (dekodiert aus Text, Hex oder Base64), und crypto.subtle.sign('HMAC', ...), um das Tag zu berechnen, und kodiert dann die rohen Bytes als Hex, Base64 oder Base64URL. Es ist dieselbe native, auditierte Implementierung, die der Browser für TLS verwendet, und läuft für mehr Geschwindigkeit außerhalb der JavaScript-Engine.

HMAC-Best-Practices

Einen Schlüssel verwenden, der mindestens so lang wie die Hash-Ausgabe ist
Verwende für HMAC-SHA256 ein Geheimnis von mindestens 32 zufälligen Bytes (256 Bit); für SHA-512 verwende 64. Ein kurzer oder entropiearmer Schlüssel ist das schwächste Glied. Generiere Schlüssel aus einer kryptografisch sicheren Zufallsquelle — niemals aus einem Passwort oder einer vorhersehbaren Zeichenkette.
Tags immer in konstanter Zeit vergleichen
Prüfe Signaturen mit einem Vergleich in konstanter Zeit (crypto.timingSafeEqual in Node, hmac.compare_digest in Python) statt mit == oder String-Gleichheit. Ein naiver Vergleich bricht beim ersten abweichenden Byte vorzeitig ab und gibt ein Timing preis, das einem Angreifer erlauben kann, ein gültiges Tag Byte für Byte zu rekonstruieren. Der Tab Prüfen dieses Tools vergleicht bereits in konstanter Zeit.
Den geheimen Schlüssel niemals loggen oder offenlegen
Halte Signaturgeheimnisse aus Logs, Fehlermeldungen, URLs und clientseitigem Code heraus. Speichere sie in einem Secrets-Manager oder in Umgebungsvariablen, rotiere sie regelmäßig und gib jeder Integration ihren eigenen Schlüssel, damit ein Leck nicht alles kompromittiert.
HMAC-SHA256 oder stärker bevorzugen
Verwende standardmäßig HMAC-SHA256; steige auf SHA-384 oder SHA-512 um, wenn eine Gegenstelle es verlangt. Vermeide HMAC-SHA1 für neue Systeme und verwende niemals HMAC-MD5. Auch wenn HMAC einen schwächeren Hash besser verträgt als eine rohe Signatur, gibt dir ein moderner Hash als Ausgangspunkt den größten Spielraum.
Die exakten Bytes signieren, samt Zeitstempel
Signiere die rohe, unveränderte Nutzlast — das Neuserialisieren von JSON oder Trimmen von Leerzeichen ändert die Bytes und zerstört die Prüfung. Nimm beim Signieren von Anfragen einen Zeitstempel oder Nonce in die signierten Daten auf und weise veraltete Signaturen zurück, um Replay-Angriffe zu verhindern.

HMAC-FAQ

Was ist HMAC?
HMAC (Hash-based Message Authentication Code) ist eine Methode, um sowohl die Integrität als auch die Authentizität einer Nachricht mithilfe eines gemeinsamen geheimen Schlüssels nachzuweisen. Du gibst eine Nachricht und einen geheimen Schlüssel in eine Hash-Funktion (hier SHA-1, SHA-256, SHA-384 oder SHA-512) in der von RFC 2104 definierten geschachtelten Konstruktion ein und erhältst ein Tag mit fester Länge. Jeder, der das Geheimnis kennt, kann das Tag neu berechnen und bestätigen, dass die Nachricht nicht verändert wurde und von jemandem stammt, der den Schlüssel besitzt. Es ist der Standardmechanismus hinter Webhook-Signaturen, signierten API-Anfragen und der HS256-Familie von JWT-Token.
Wie unterscheidet sich HMAC von einem reinen Hash wie SHA-256?
Ein reiner Hash wie SHA-256 beweist nur die Integrität: Jeder kann ihn neu berechnen, also kann auch jeder einen passenden Hash für eine manipulierte Nachricht fälschen. HMAC mischt einen geheimen Schlüssel hinein, sodass nur Parteien mit diesem Schlüssel ein gültiges Tag erzeugen oder prüfen können — das fügt Authentizität zur Integrität hinzu. HMAC verwendet außerdem eine geschachtelte Zwei-Pass-Konstruktion (inneres und äußeres Hashen mit aus dem Schlüssel abgeleiteten Pads), die es immun gegen die Längenerweiterungsangriffe macht, die rohes SHA-1 und SHA-256 betreffen. Kurz: Verwende einen Hash, um zufällige Beschädigung zu erkennen, und einen HMAC, um absichtliche Manipulation durch einen Angreifer zu erkennen, der deinen Schlüssel nicht kennt.
Wie prüfe ich eine eingehende Webhook-Signatur?
Nimm den rohen Anfragetext genau so, wie er empfangen wurde (serialisiere das JSON nicht neu — selbst umsortierte Schlüssel zerstören die Signatur), wähle denselben Algorithmus wie dein Anbieter (meist HMAC-SHA256), gib dein Signaturgeheimnis mit der korrekten Schlüsselkodierung ein und stelle das Ausgabeformat passend zum Header ein (Hex für GitHubs sha256=-Präfix, Base64 für Header im Stripe/Twilio-Stil). Öffne dann den Tab Prüfen, füge die Signatur aus dem Header ein (etwa X-Hub-Signature-256), und das Tool meldet mittels eines Vergleichs in konstanter Zeit Übereinstimmung oder Nichtübereinstimmung. Vertraue der Nutzlast nur, wenn sie übereinstimmt.
Welche Schlüssel- und Ausgabekodierung verwendet mein Server?
Es gibt keine universelle Antwort — es hängt von deinem Anbieter ab, was genau der Grund ist, warum dieses Tool beide als explizite Optionen anbietet. Häufige Muster: GitHub verwendet ein UTF-8-Textgeheimnis und Hex-Ausgabe in Kleinbuchstaben mit einem sha256=-Präfix; Stripe verwendet ein Textgeheimnis und Base64; AWS Signature V4 verwendet abgeleitete Binärschlüssel und Hex; viele interne Systeme geben Base64- oder Hex-Geheimnisse aus, die vor dem Signieren in rohe Bytes dekodiert werden müssen. Wenn dein HMAC nicht übereinstimmt, ist fast immer die Kodierung schuld — probiere denselben Schlüssel als Text, Hex und Base64, um die vom Server erwartete Interpretation zu finden.
Ist HMAC-SHA256 sicher?
Ja. HMAC-SHA256 gilt weithin als sicher und ist die empfohlene Standardeinstellung für die Nachrichtenauthentifizierung. Seine Sicherheit ergibt sich aus der HMAC-Konstruktion plus einem starken zugrunde liegenden Hash, und es bleibt sicher, obwohl es Kollisionsangriffe gegen den nackten Hash gibt — HMAC verlässt sich nicht auf Kollisionsresistenz, wie es eine digitale Signatur tut. Die realen Risiken sind operativ, nicht algorithmisch: ein schwacher oder geleakter geheimer Schlüssel, das Loggen des Schlüssels oder ein Vergleich, der nicht in konstanter Zeit läuft. Verwende einen langen Zufallsschlüssel und vergleiche Tags in konstanter Zeit, dann hält HMAC-SHA256 stand.
Warum gibt es hier kein HMAC-MD5 oder HMAC-SHA-3?
Das ist Absicht. Dieses Tool bietet nur SHA-1, SHA-256, SHA-384 und SHA-512 an, weil dies die Hash-Funktionen sind, die die native Web-Crypto-API des Browsers unterstützt, was alles schnell und vollständig clientseitig ohne zusätzliche Bibliotheken hält. HMAC-MD5 wird ausgelassen, weil MD5 veraltet ist und du keine neuen Systeme damit beginnen solltest. HMAC-SHA-3 wird ausgelassen, weil Web Crypto SHA-3 nicht implementiert; es hinzuzufügen würde das Ausliefern eines JavaScript-Polyfills erfordern. Für praktisch alle modernen Anwendungsfälle ist HMAC-SHA256 ohnehin die richtige Wahl.
HS256 (HMAC) vs. RS256 (RSA) — was sollte ich für JWTs verwenden?
HS256 signiert und prüft ein JWT mit einem einzigen gemeinsamen Geheimnis über HMAC-SHA256, während RS256 mit einem privaten RSA-Schlüssel signiert und mit dem passenden öffentlichen Schlüssel prüft. Verwende HS256, wenn eine Partei die Token sowohl ausstellt als auch validiert (ein Monolith oder vertrauenswürdige interne Dienste, die das Geheimnis sicher teilen können) — es ist einfacher und schneller. Verwende RS256, wenn Dritte oder viele Dienste Token prüfen müssen, sie aber nicht erstellen können dürfen, da du nur den öffentlichen Schlüssel verteilen kannst. Du kannst die kodierte Struktur beider im JWT-Kodierer erkunden; die HS256-Signatur ist genau ein HMAC-SHA256 über Header und Nutzlast.

Verwandte Werkzeuge

Alle Werkzeuge anzeigen →