HMAC-Generator

Berechnen Sie den HMAC von Text, Hex-Bytes oder einer Datei mit einem geheimen Schlüssel, wahlweise mit SHA-256, SHA-384, SHA-512, SHA-1 oder MD5, und gleichen Sie ihn mit einer Webhook- oder API-Signatur ab. Nichts verlässt Ihren Browser.

Läuft vollständig in Ihrem Browser. Es wird nichts hochgeladen.

Anleitung

  1. Wählen Sie den „Algorithmus“. HMAC-SHA256 ist voreingestellt und wird von den meisten Webhooks und APIs verwendet.
  2. Tragen Sie den Schlüssel unter „Geheimer Schlüssel“ ein und stellen Sie das „Schlüsselformat“ auf „Text“ (wird als UTF-8 gelesen), „Hex“ oder „Base64“. Verwenden Sie „Hex“ oder „Base64“, wenn der Schlüssel aus Rohbytes besteht und nicht aus einer passwortähnlichen Zeichenfolge.
  3. Geben Sie die „Nachricht“ ein oder fügen Sie sie ein, stellen Sie die Eingabe für Rohbytes auf „Hex“ um oder klicken Sie auf „Datei öffnen“. Der HMAC wird während der Eingabe aktualisiert.
  4. Wählen Sie unter „Ausgabe als“ „hex (Kleinbuchstaben)“, „HEX (Großbuchstaben)“ oder „Base64“ und kopieren Sie das Ergebnis, oder fügen Sie eine empfangene Signatur unter „Vergleichen mit“ ein, um „Übereinstimmung“ oder „Keine Übereinstimmung“ zu sehen.

So funktioniert HMAC

HMAC (Hash-based Message Authentication Code, RFC 2104) kombiniert eine kryptografische Hashfunktion mit einem geheimen Schlüssel. Nur wer den Schlüssel kennt, kann für eine Nachricht den richtigen Wert erzeugen. Ein übereinstimmender HMAC belegt daher zweierlei: Die Nachricht wurde nicht verändert, und sie stammt von jemandem, der den Schlüssel besitzt.

Die Konstruktion lautet H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ message)). Ist der Schlüssel länger als die Blockgröße der Hashfunktion (64 Bytes bei MD5, SHA-1 und SHA-256, 128 bei SHA-384 und SHA-512), wird er zuerst gehasht. Dann wird er mit Nullen auf diese Größe aufgefüllt und per XOR einmal mit ipad (Bytes mit dem Wert 0x36) für einen inneren Hashwert über die Nachricht und einmal mit opad (Bytes mit dem Wert 0x5c) für einen äußeren Hashwert über das innere Ergebnis verknüpft. Einem naiven SHA-256(key ‖ message) fehlt dieser äußere Hashwert: Wer ein einziges Tag sieht, kann Daten an die Nachricht anhängen und ohne den Schlüssel ein gültiges neues Tag berechnen (Length-Extension-Angriff).

Die Ausgabe ist so lang wie der zugrunde liegende Hashwert: 32 Bytes oder 64 Hex-Zeichen bei HMAC-SHA256. RFC 2104 empfiehlt einen mindestens ebenso langen Schlüssel, und der Zufalls-Base64-Generator erzeugt passende Schlüssel.

Wo HMAC-Signaturen verwendet werden

  • GitHub-Webhooks. Der Header X-Hub-Signature-256 besteht aus sha256=, gefolgt vom HMAC-SHA256 des rohen Request-Bodys in Hex, berechnet mit dem Webhook-Secret als Schlüssel. Sie können den gesamten Header-Wert unter „Vergleichen mit“ einfügen; das Präfix sha256= wird ignoriert.
  • Stripe-Webhooks. Der Header Stripe-Signature enthält einen Zeitstempel t und eine Signatur v1: den HMAC-SHA256 in Hex über den Zeitstempel, einen Punkt und den rohen Body, berechnet mit dem Endpoint-Secret (whsec_...) als Text-Schlüssel.
  • Shopify-Webhooks. X-Shopify-Hmac-Sha256 enthält den HMAC-SHA256 des rohen Bodys in Base64, berechnet mit dem Client-Secret der App als Schlüssel. Wählen Sie also unter „Ausgabe als“ „Base64“ oder fügen Sie den Header-Wert unter „Vergleichen mit“ ein.
  • AWS Signature Version 4. Der Signaturschlüssel wird durch verkettetes HMAC-SHA256 abgeleitet: zuerst über das Datum mit AWS4 plus dem Secret Access Key als Schlüssel, dann über die Region, den Dienst und aws4_request, jeweils mit dem vorherigen Ergebnis als Schlüssel. Stellen Sie das „Schlüsselformat“ auf „Hex“, um die Ausgabe eines Schritts in den nächsten zu übernehmen.
  • JSON Web Tokens. HS256, HS384 und HS512 sind HMAC-SHA256, -384 und -512 über den kodierten Header, einen Punkt und die kodierte Payload. Der dritte Teil des Tokens ist dieser HMAC in URL-sicherem Base64, den „Vergleichen mit“ unverändert akzeptiert. Der JWT-Decoder prüft vollständige Token.

Berechnen Sie den HMAC immer über den rohen Body, genau so, wie er empfangen wurde. Wird JSON geparst und erneut serialisiert, ändern sich Leerzeichen oder die Reihenfolge der Schlüssel, und schon ein zusätzlicher Zeilenumbruch ergibt einen völlig anderen HMAC.

HMAC im Code

# Python
import hmac, hashlib
sig = hmac.new(b'key', b'message', hashlib.sha256).hexdigest()
hmac.compare_digest(sig, received)        # Vergleich in konstanter Zeit

// Node.js
const crypto = require('crypto');
const sig = crypto.createHmac('sha256', 'key').update('message').digest('hex');
// timingSafeEqual wirft bei unterschiedlichen Längen einen Fehler, daher zuerst prüfen
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(received));

// PHP: die Nachricht steht vor dem Schlüssel
$sig = hash_hmac('sha256', 'message', 'key');
hash_equals($sig, $received);

# OpenSSL: ein Text-Schlüssel, dann derselbe Schlüssel als Hex
printf '%s' 'message' | openssl dgst -sha256 -hmac 'key'
printf '%s' 'message' | openssl dgst -sha256 -mac HMAC -macopt hexkey:6b6579

# Testvektor: Schlüssel "key", Nachricht "The quick brown fox jumps over the lazy dog"
# HMAC-SHA256 = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

Wenn Sie eine Signatur in Ihrem eigenen Code prüfen, verwenden Sie einen Vergleich in konstanter Zeit wie in den Beispielen oben. Ein einfaches == bricht beim ersten abweichenden Zeichen ab, und dieser Zeitunterschied kann es einem Angreifer ermöglichen, eine gültige Signatur Byte für Byte zu ermitteln. Lehnen Sie bei Verfahren mit Zeitstempel wie dem von Stripe außerdem Anfragen ab, deren Zeitstempel älter als einige Minuten ist; das verhindert Replay-Angriffe.

Häufig gestellte Fragen

Sind HMAC-MD5 und HMAC-SHA1 noch sicher?

Kollisionsangriffe brechen MD5 und SHA-1 als einfache Hashfunktionen, liefern aber keinen praktikablen Weg, einen HMAC zu fälschen. Dieser hängt von anderen Eigenschaften der Hashfunktion und von einem geheimen Schlüssel ab (RFC 6151 behandelt HMAC-MD5). Integrationen, die diese Verfahren voraussetzen, etwa TOTP-Codes auf Basis von HMAC-SHA1, können Sie beibehalten. Für neue Entwicklungen verwenden Sie HMAC-SHA256.

Warum stimmt mein HMAC nicht mit der Webhook-Signatur überein?

Die üblichen Ursachen: Es wurde geparstes und neu serialisiertes JSON statt des rohen Bodys gehasht, die Nachricht endet mit einem Zeilenumbruch, das Secret oder das Schlüsselformat ist falsch (ein Base64- oder Hex-Secret wurde als „Text“ eingegeben oder umgekehrt), oder der Algorithmus stimmt nicht. Hex oder Base64 ist dagegen kein Problem: „Vergleichen mit“ akzeptiert Hex in Groß- und Kleinbuchstaben, Standard-Base64 und URL-sicheres Base64.

Was ist der Unterschied zwischen einem HMAC und einem einfachen Hashwert?
Einen einfachen Hashwert, etwa mit SHA-256, kann jeder berechnen; er zeigt also nur, dass Daten nicht versehentlich verändert wurden. Ein HMAC lässt sich nur mit dem geheimen Schlüssel berechnen. Ein gültiger HMAC zeigt daher zusätzlich, dass ihn jemand erstellt hat, der diesen Schlüssel besitzt.
Ist ein HMAC dasselbe wie eine digitale Signatur?

Nein. Bei einem HMAC teilen sich beide Seiten ein gemeinsames Secret, sodass jeder, der ein Tag prüfen kann, auch eines erstellen kann. Signaturen wie RSA oder ECDSA (RS256 oder ES256 in JWTs) werden mit einem privaten Schlüssel erstellt und mit einem öffentlichen Schlüssel geprüft, sodass diejenigen, die sie prüfen, sie nicht fälschen können.

Wird mein geheimer Schlüssel an einen Server gesendet?

Nein. HMAC-SHA1 und die SHA-2-Varianten werden mit der Web Crypto API Ihres Browsers berechnet, HMAC-MD5 per JavaScript auf der Seite. Schlüssel und Nachricht verlassen Ihr Gerät nie. Gehen Sie dennoch sorgfältig mit produktiven Secrets um und tauschen Sie einen Schlüssel aus, wenn er offengelegt worden sein könnte.