Utilia

HMAC-generator

Beräkna HMAC-SHA1, SHA-256, SHA-384 eller SHA-512 med en nyckel i text, hex eller Base64, få hex och Base64 och kontrollera en webhook-signatur.

Meddelandet signeras exakt som det är skrivet, kodat som UTF-8, inklusive mellanslag och radbrytningar.

Jämförelsen körs i konstant tid, som en server bör göra den, så att tidsåtgången inte avslöjar hur många tecken som stämmer.

Så beräknar du en HMAC

  1. Klistra in ditt Meddelande. För en webhook måste det vara det råa innehållet i begäran, byte för byte.
  2. Skriv in Hemlig nyckel och välj dess Nyckelformat: Text (UTF-8), Hexadecimalt eller Base64.
  3. Välj Algoritm: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 eller HMAC-SHA512.
  4. Resultatet uppdateras medan du skriver, och du kan också klicka på Generera HMAC. Du får HMAC (hex), HMAC (Base64) och ett Signaturhuvud för webhook (GitHub-stil), alla med en knapp för att Kopiera.
  5. För att kontrollera en signatur du har fått klistrar du in den i Jämför med en förväntad signatur (hex, Base64 eller sha256=…). Verktyget visar om den stämmer.

Meddelandet kodas som UTF-8 exakt som det är skrivet, inklusive mellanslag och radbrytningar. Beräkningen använder webbläsarens Web Crypto API, och meddelandet och nyckeln lämnar aldrig din enhet.

Vad en HMAC är

En HMAC (hash-based message authentication code, RFC 2104) kombinerar en hemlig nyckel med en hashfunktion:

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

där K′ är nyckeln utfylld till hashfunktionens blockstorlek (hashad först om den är längre), och ipad/opad är fasta konstanter. Bara den som känner till nyckeln kan ta fram rätt kod för ett meddelande, och varje ändring av meddelandet ändrar koden helt. Därför används HMAC för att signera webhooks, API-anrop (till exempel AWS Signature Version 4) och JSON Web Tokens av typen HS256.

En HMAC är ingen kryptering: meddelandet döljs inte. Det är inte heller en lösenordshash. För att lagra lösenord använder du en långsam funktion som bcrypt eller Argon2.

Utdatans längd beror på algoritmen: 20 byte för SHA-1, 32 för SHA-256, 48 för SHA-384 och 64 för SHA-512. HMAC-SHA1 anses fortfarande säker som MAC, men välj SHA-256 för nya system. En slumpmässig nyckel som är minst lika lång som utdata (32 byte för HMAC-SHA256) rekommenderas. Med nycklar i hex eller Base64 kan du skriva in sådana slumpmässiga byte direkt.

Kontrollera en webhook från GitHub

GitHub signerar varje leverans med din webhook-hemlighet och skickar resultatet i huvudet X-Hub-Signature-256 som sha256= följt av HMAC-SHA256 för innehållet i hex. Exemplet i GitHubs egen dokumentation använder hemligheten It's a Secret to Everybody och innehållet Hello, World!. Skriv in dem här med HMAC-SHA256 så visar huvudet:

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

Jämförelsefältet accepterar hela huvudraden, värdet sha256=… eller en ren signatur i hex eller Base64 (Stripe, Shopify och Slack använder liknande upplägg med egna huvuden och signerade strängar). För SHA-384 och SHA-512 visar verktyget ett generiskt huvud X-Signature, eftersom det inte finns någon gemensam standard.

Jämförelse i konstant tid

En server som jämför signaturer med en vanlig strängjämförelse slutar vid det första tecknet som skiljer sig. Genom att mäta svarstider kan en angripare då gissa en giltig signatur ett tecken i taget. Jämförelsen i det här verktyget går igenom varje byte oavsett resultat, precis som en server bör göra med crypto.timingSafeEqual i Node.js, hmac.compare_digest i Python eller hash_equals i PHP.

Vanliga frågor

Varför skiljer sig min HMAC från den som min server beräknar?

De vanligaste orsakerna är ett annat meddelande (servern signerar det råa innehållet medan du klistrade in omformaterad JSON, eller så skiljer sig radbrytningarna), en nyckel i fel Nyckelformat eller en annan algoritm. Redan ett extra mellanslag ändrar hela resultatet.

Ska utdata vara hex eller Base64?

Båda kodar samma byte. GitHub använder hex, medan många andra API:er, som Shopify, använder Base64. Använd det format som det mottagande systemet förväntar sig.

Kan jag använda en tom nyckel?

Verktyget accepterar den och varnar dig: med en tom nyckel kan vem som helst beräkna samma HMAC, så den bevisar ingenting.

Är HMAC-SHA1 knäckt som SHA-1?

Kollisionsattackerna mot SHA-1 knäcker inte HMAC-SHA1, som fortfarande anses säker som MAC. Den stöds kvar för äldre system, som det gamla huvudet X-Hub-Signature, men nya system bör använda HMAC-SHA256 eller starkare.

Är min hemliga nyckel säker här?

Nyckeln och meddelandet behandlas bara i din webbläsare och skickas aldrig någonstans. Var ändå försiktig med en hemlighet från produktion, och byt ut den om du tror att den har exponerats.