Utilia

HMAC-generator

Beregn en HMAC-SHA1, SHA-256, SHA-384 eller SHA-512 med en nøgle som tekst, hex eller Base64, få hex- og Base64-output, og tjek en webhook-signatur.

Meddelelsen signeres præcis, som den er skrevet, kodet som UTF-8, med mellemrum og linjeskift.

Sammenligningen kører i konstant tid, sådan som en server bør gøre det, så den tid, den tager, ikke afslører, hvor mange tegn der passer.

Sådan beregner du en HMAC

  1. Indsæt Meddelelse. For en webhook skal det være det rå forespørgselsindhold, byte for byte.
  2. Indtast Hemmelig nøgle, og vælg dens Nøgleformat: Tekst (UTF-8), Hexadecimal eller Base64.
  3. Vælg Algoritme: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 eller HMAC-SHA512.
  4. Resultatet opdateres, mens du skriver. Du kan også klikke på Generér HMAC. Du får HMAC (hex), HMAC (Base64) og en Webhook-signaturheader (GitHub-stil), hver med en knap Kopiér.
  5. For at kontrollere en signatur, du har modtaget, indsætter du den i Sammenlign med en forventet signatur (hex, Base64 eller sha256=…). Værktøjet fortæller, om den passer.

Meddelelsen kodes som UTF-8 præcis, som den er skrevet, med mellemrum og linjeskift. Beregningen bruger din browsers Web Crypto API. Meddelelsen og nøglen forlader aldrig din enhed.

Hvad en HMAC er

En HMAC (hash-based message authentication code, RFC 2104) kombinerer en hemmelig nøgle med en hashfunktion:

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

hvor K′ er nøglen udfyldt til hashfunktionens blokstørrelse (hashet først, hvis den er længere), og ipad/opad er faste konstanter. Kun den, der kender nøglen, kan lave den rigtige kode til en meddelelse, og enhver ændring af meddelelsen ændrer koden fuldstændigt. Derfor bruges HMAC’er til at signere webhooks, API-forespørgsler (for eksempel AWS Signature Version 4) og HS256 JSON Web Tokens.

En HMAC er ikke kryptering: Meddelelsen skjules ikke. Den er heller ikke en hash af en adgangskode. Til lagring af adgangskoder skal du bruge en langsom funktion som bcrypt eller Argon2.

Outputtets længde afhænger af algoritmen: 20 bytes for SHA-1, 32 for SHA-256, 48 for SHA-384 og 64 for SHA-512. HMAC-SHA1 regnes stadig for sikker som MAC, men vælg SHA-256 til nye systemer. En tilfældig nøgle, der mindst er lige så lang som outputtet (32 bytes til HMAC-SHA256), anbefales. Med hex- eller Base64-nøgler kan du indtaste sådanne tilfældige bytes direkte.

Kontrol af en GitHub-webhook

GitHub signerer hver levering med din webhook-hemmelighed og sender resultatet i headeren X-Hub-Signature-256 som sha256= efterfulgt af indholdets HMAC-SHA256 i hex. GitHubs eget eksempel i dokumentationen bruger hemmeligheden It's a Secret to Everybody og indholdet Hello, World!. Indtast dem her med HMAC-SHA256, så viser headeren:

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

Sammenligningsfeltet accepterer hele headerlinjen, værdien sha256=… eller en ren signatur i hex eller Base64 (Stripe, Shopify og Slack bruger lignende ordninger med egne headere og signerede strenge). For SHA-384 og SHA-512 viser værktøjet en generisk X-Signature-header, da der ikke findes nogen fælles standard.

Sammenligning i konstant tid

En server, der sammenligner signaturer med en almindelig strengsammenligning, stopper ved det første tegn, der er forskelligt. Ved at måle svartider kunne en angriber gætte en gyldig signatur et tegn ad gangen. Sammenligningen i dette værktøj gennemgår hver byte uanset resultatet, sådan som en server bør gøre med crypto.timingSafeEqual i Node.js, hmac.compare_digest i Python eller hash_equals i PHP.

Ofte stillede spørgsmål

Hvorfor er min HMAC forskellig fra den, min server beregner?

De sædvanlige årsager er en anden meddelelse (serveren signerer det rå indhold, mens du har indsat omformateret JSON, eller linjeskiftene er forskellige), en nøgle i det forkerte Nøgleformat eller en anden algoritme. Selv ét ekstra mellemrum ændrer hele resultatet.

Skal outputtet være hex eller Base64?

Begge koder de samme bytes. GitHub bruger hex, mens mange andre API’er, som Shopify, bruger Base64. Brug det format, det modtagende system forventer.

Kan jeg bruge en tom nøgle?

Værktøjet accepterer den og advarer dig: Med en tom nøgle kan alle beregne den samme HMAC, så den beviser ingenting.

Er HMAC-SHA1 brudt ligesom SHA-1?

Angrebene med SHA-1-kollisioner bryder ikke HMAC-SHA1, som stadig regnes for sikker som MAC. Den understøttes stadig til ældre systemer som den gamle header X-Hub-Signature, men nye systemer bør bruge HMAC-SHA256 eller stærkere.

Er min hemmelige nøgle sikker her?

Nøglen og meddelelsen behandles kun i din browser og sendes aldrig nogen steder hen. Behandl alligevel en produktionshemmelighed med omhu, og skift den ud, hvis du tror, den er blevet afsløret.