Utilia

HMAC-generator

Bereken een HMAC-SHA1, SHA-256, SHA-384 of SHA-512 met een tekst-, hex- of Base64-sleutel, krijg hex en Base64 en controleer een webhook-signature.

Het bericht wordt precies zoals getypt ondertekend, gecodeerd als UTF-8, inclusief spaties en regeleinden.

De vergelijking gebeurt in constante tijd, zoals een server het hoort te doen, zodat de benodigde tijd niet verraadt hoeveel tekens overeenkomen.

Zo bereken je een HMAC

  1. Plak het Bericht. Voor een webhook moet dat de ruwe request-body zijn, byte voor byte.
  2. Voer de Geheime sleutel in en kies het Sleutelformaat: Tekst (UTF-8), Hexadecimaal of Base64.
  3. Kies het Algoritme: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 of HMAC-SHA512.
  4. Het resultaat wordt bijgewerkt terwijl je typt; je kunt ook op HMAC genereren klikken. Je krijgt de HMAC (hex), de HMAC (Base64) en een Webhook-signatureheader (GitHub-stijl), elk met een knop Kopiëren.
  5. Wil je een ontvangen signature controleren, plak die dan in Vergelijken met een verwachte signature (hex, Base64 of sha256=…). De tool zegt of hij overeenkomt.

Het bericht wordt precies zoals getypt als UTF-8 gecodeerd, inclusief spaties en regeleinden. De berekening gebruikt de Web Crypto-API van je browser; het bericht en de sleutel verlaten je apparaat nooit.

Wat een HMAC is

Een HMAC (hash-based message authentication code, RFC 2104) combineert een geheime sleutel met een hashfunctie:

HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))

waarbij K′ de sleutel is, aangevuld tot de blokgrootte van de hash (en eerst gehasht als hij langer is), en ipad/opad vaste constanten zijn. Alleen wie de sleutel kent, kan de juiste code voor een bericht maken, en elke wijziging in het bericht verandert de code volledig. Daarom worden HMAC’s gebruikt om webhooks, API-verzoeken (bijvoorbeeld AWS Signature Version 4) en HS256-JSON Web Tokens te ondertekenen.

Een HMAC is geen versleuteling: het bericht wordt niet verborgen. Het is ook geen wachtwoordhash; gebruik voor het opslaan van wachtwoorden een trage functie zoals bcrypt of Argon2.

De lengte van de uitvoer hangt af van het algoritme: 20 bytes voor SHA-1, 32 voor SHA-256, 48 voor SHA-384 en 64 voor SHA-512. HMAC-SHA1 geldt als MAC nog steeds als veilig, maar kies voor nieuwe systemen liever SHA-256. Een willekeurige sleutel die minstens zo lang is als de uitvoer (32 bytes voor HMAC-SHA256) wordt aanbevolen; met hex- of Base64-sleutels kun je zulke willekeurige bytes direct invoeren.

Een GitHub-webhook controleren

GitHub ondertekent elke levering met je webhook-secret en stuurt het resultaat in de header X-Hub-Signature-256 als sha256= gevolgd door de hex-HMAC-SHA256 van de body. Het voorbeeld uit de documentatie van GitHub gebruikt het secret It's a Secret to Everybody en de body Hello, World!. Voer die hier in met HMAC-SHA256 en de header toont:

X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17

Het vergelijkingsveld accepteert de hele headerregel, de waarde sha256=…, of een losse signature in hex of Base64 (Stripe, Shopify en Slack gebruiken vergelijkbare schema’s met hun eigen headers en ondertekende strings). Voor SHA-384 en SHA-512 toont de tool een algemene header X-Signature, omdat daar geen gangbare standaard voor is.

Vergelijken in constante tijd

Een server die signatures vergelijkt met een gewone stringvergelijking, stopt bij het eerste teken dat verschilt. Door reactietijden te meten zou een aanvaller een geldige signature teken voor teken kunnen raden. De vergelijking in deze tool bekijkt elke byte, wat de uitkomst ook is, zoals een server dat hoort te doen met crypto.timingSafeEqual in Node.js, hmac.compare_digest in Python of hash_equals in PHP.

Veelgestelde vragen

Waarom verschilt mijn HMAC van die van mijn server?

De gebruikelijke oorzaken zijn een ander bericht (de server ondertekent de ruwe body, terwijl jij opnieuw geformatteerde JSON hebt geplakt, of de regeleinden verschillen), een sleutel in het verkeerde Sleutelformaat, of een ander algoritme. Zelfs één extra spatie verandert het hele resultaat.

Moet de uitvoer hex of Base64 zijn?

Beide coderen dezelfde bytes. GitHub gebruikt hex, terwijl veel andere API’s, zoals Shopify, Base64 gebruiken. Kies het formaat dat het ontvangende systeem verwacht.

Kan ik een lege sleutel gebruiken?

De tool accepteert het en waarschuwt je: met een lege sleutel kan iedereen dezelfde HMAC berekenen, dus bewijst hij niets.

Is HMAC-SHA1 net zo gebroken als SHA-1?

De collision-aanvallen op SHA-1 breken HMAC-SHA1 niet; dat geldt als MAC nog steeds als veilig. Het wordt nog ondersteund voor oudere systemen, zoals de oude header X-Hub-Signature, maar nieuwe systemen horen HMAC-SHA256 of sterker te gebruiken.

Is mijn geheime sleutel hier veilig?

De sleutel en het bericht worden alleen in je browser verwerkt en nergens naartoe gestuurd. Ga toch zorgvuldig om met een productiesecret, en vervang het als je denkt dat het is uitgelekt.