Utilia

HMAC generator

Izračunaj HMAC-SHA1, SHA-256, SHA-384 ili SHA-512 sa ključem kao tekst, heks ili Base64, dobij heks i Base64 izlaz i proveri potpis webhooka u pregledaču.

Poruka se potpisuje tačno onako kako je upisana, kodirana u UTF-8, uključujući razmake i prelome redova.

Poređenje se izvršava u konstantnom vremenu, kao što bi trebalo da radi server, pa utrošeno vreme ne otkriva koliko se znakova poklapa.

Kako da izračunaš HMAC

  1. Nalepi Poruka. Za webhook, to mora biti sirovo telo zahteva, bajt po bajt.
  2. Unesi Tajni ključ i izaberi njegov Format ključa: Tekst (UTF-8), Heksadecimalno ili Base64.
  3. Izaberi Algoritam: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 ili HMAC-SHA512.
  4. Rezultat se osvežava dok kucaš, a možeš i da klikneš Generiši HMAC. Dobijaš HMAC (heks), HMAC (Base64) i Zaglavlje potpisa webhooka (GitHub stil), svaki sa dugmetom Kopiraj.
  5. Da proveriš potpis koji si primio, nalepi ga u Uporedi sa očekivanim potpisom (heks, Base64 ili sha256=…). Alat kaže da li se poklapa.

Poruka se kodira u UTF-8 tačno onako kako je upisana, uključujući razmake i prelome redova. Izračunavanje koristi Web Crypto API tvog pregledača; poruka i ključ nikada ne napuštaju tvoj uređaj.

Šta je HMAC

HMAC (kod za potvrdu autentičnosti poruke zasnovan na heš funkciji, RFC 2104) kombinuje tajni ključ sa heš funkcijom:

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

gde je K′ ključ dopunjen do veličine bloka heša (prvo se heširaju ako je duži), a ipad/opad su fiksne konstante. Samo onaj ko zna ključ može da proizvede ispravan kod za poruku, a svaka promena poruke potpuno menja kod. Zato HMAC-ovi potpisuju webhookove, API zahteve (na primer AWS Signature Version 4) i JSON Web Tokene tipa HS256.

HMAC nije šifrovanje: poruka nije sakrivena. Nije ni heš lozinke; za čuvanje lozinki koristi sporu funkciju poput bcrypt-a ili Argon2.

Dužina izlaza zavisi od algoritma: 20 bajtova za SHA-1, 32 za SHA-256, 48 za SHA-384 i 64 za SHA-512. HMAC-SHA1 se i dalje smatra bezbednim kao MAC, ali za nove sisteme radije koristi SHA-256. Preporučuje se nasumičan ključ bar onoliko dug koliki je izlaz (32 bajta za HMAC-SHA256); heks ili Base64 ključevi omogućavaju da takve nasumične bajtove uneseš direktno.

Provera GitHub webhooka

GitHub potpisuje svaku isporuku tvojom tajnom webhooka i šalje rezultat u zaglavlju X-Hub-Signature-256 kao sha256= iza kojeg sledi heks HMAC-SHA256 tela. Primer iz GitHubove dokumentacije koristi tajnu It's a Secret to Everybody i telo Hello, World!; unesi ih ovde sa HMAC-SHA256 i zaglavlje prikazuje:

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

Polje za poređenje prihvata ceo red zaglavlja, vrednost sha256=… ili goli heks ili Base64 potpis (Stripe, Shopify i Slack koriste slične šeme sa sopstvenim zaglavljima i potpisanim nizovima). Za SHA-384 i SHA-512 alat prikazuje opšte zaglavlje X-Signature, jer ne postoji zajednički standard.

Poređenje u konstantnom vremenu

Server koji potpise poredi običnim poređenjem nizova staje na prvom različitom znaku. Merenjem vremena odgovora napadač bi mogao da pogodi ispravan potpis znak po znak. Poređenje u ovom alatu ispituje svaki bajt bez obzira na ishod, kao što bi server trebalo da radi pomoću crypto.timingSafeEqual u Node.js-u, hmac.compare_digest u Pythonu ili hash_equals u PHP-u.

Česta pitanja

Zašto se moj HMAC razlikuje od onog koji izračunava moj server?

Uobičajeni uzroci su drugačija poruka (server potpisuje sirovo telo, a ti si nalepio ponovo formatiran JSON, ili se razlikuju prelomi redova), ključ u pogrešnom Format ključa ili drugi algoritam. Čak i jedan suvišni razmak menja ceo rezultat.

Da li izlaz treba da bude heks ili Base64?

Oba kodiraju iste bajtove. GitHub koristi heks, dok mnogi drugi API-ji, poput Shopifyja, koriste Base64. Koristi format koji očekuje sistem koji prima potpis.

Mogu li da koristim prazan ključ?

Alat ga prihvata i upozorava te: sa praznim ključem svako može da izračuna isti HMAC, pa on ništa ne dokazuje.

Da li je HMAC-SHA1 probijen kao SHA-1?

Napadi kolizijom na SHA-1 ne razbijaju HMAC-SHA1, koji se i dalje smatra bezbednim kao MAC. I dalje je podržan za nasleđene sisteme, poput starog zaglavlja X-Hub-Signature, ali novi sistemi treba da koriste HMAC-SHA256 ili jači.

Da li je moj tajni ključ bezbedan ovde?

Ključ i poruka obrađuju se samo u tvom pregledaču i nikada se nigde ne šalju. Ipak, sa produkcionom tajnom postupaj pažljivo i zameni je ako misliš da je izložena.