Utilia

HMAC generator

Izračunaj HMAC-SHA1, SHA-256, SHA-384 ili SHA-512 s tekstnim, hex ili Base64 ključem, dobij hex i Base64 izlaz i provjeri potpis webhooka u pregledniku.

Poruka se potpisuje točno onako kako je upisana, kodirana kao UTF-8, uključujući razmake i prijelome redaka.

Usporedba se izvodi u konstantnom vremenu, kako bi je trebao raditi poslužitelj, pa utrošeno vrijeme ne otkriva koliko se znakova podudara.

Kako izračunati HMAC

  1. Zalijepi Poruka. Za webhook to mora biti sirovo tijelo zahtjeva, bajt po bajt.
  2. Upiši Tajni ključ i odaberi njegov Format ključa: Tekst (UTF-8), Heksadecimalno ili Base64.
  3. Odaberi Algoritam: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 ili HMAC-SHA512.
  4. Rezultat se osvježava dok tipkaš; možeš kliknuti i Generiraj HMAC. Dobivaš HMAC (hex), HMAC (Base64) i Zaglavlje potpisa webhooka (u stilu GitHuba), svaki s gumbom Kopiraj.
  5. Da provjeriš primljeni potpis, zalijepi ga u Usporedi s očekivanim potpisom (hex, Base64 ili sha256=…). Alat javlja podudara li se.

Poruka se kodira kao UTF-8 točno onako kako je upisana, uključujući razmake i prijelome redaka. Izračun koristi Web Crypto API tvog preglednika; poruka i ključ nikada ne napuštaju tvoj uređaj.

Što je HMAC

HMAC (kôd za provjeru autentičnosti poruke temeljen na hashu, RFC 2104) kombinira tajni ključ s hash funkcijom:

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

pri čemu je K′ ključ dopunjen do veličine bloka hasha (najprije se sažima ako je dulji), a ipad/opad su fiksne konstante. Samo onaj tko zna ključ može proizvesti ispravan kôd za poruku, a svaka promjena poruke potpuno mijenja kôd. Zato HMAC-ovi potpisuju webhookove, API zahtjeve (na primjer AWS Signature Version 4) i JSON Web Tokene HS256.

HMAC nije šifriranje: poruka nije skrivena. Nije ni hash lozinke; za pohranu lozinki upotrijebi sporu funkciju poput bcrypta ili Argon2.

Duljina izlaza ovisi o algoritmu: 20 bajtova za SHA-1, 32 za SHA-256, 48 za SHA-384 i 64 za SHA-512. HMAC-SHA1 se kao MAC i dalje smatra sigurnim, ali za nove sustave preferiraj SHA-256. Preporučuje se nasumični ključ barem jednako dug kao izlaz (32 bajta za HMAC-SHA256); hex ili Base64 ključevi omogućuju da takve nasumične bajtove upišeš izravno.

Provjera GitHub webhooka

GitHub potpisuje svaku isporuku tvojom tajnom webhooka i šalje rezultat u zaglavlju X-Hub-Signature-256 kao sha256= iza kojeg slijedi hex HMAC-SHA256 tijela. Primjer iz GitHubove dokumentacije koristi tajnu It's a Secret to Everybody i tijelo Hello, World!; upiši ih ovdje s HMAC-SHA256 i zaglavlje prikazuje:

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

Polje za usporedbu prihvaća cijeli redak zaglavlja, vrijednost sha256=… ili goli hex ili Base64 potpis (Stripe, Shopify i Slack koriste slične sheme sa svojim zaglavljima i potpisanim nizovima). Za SHA-384 i SHA-512 alat prikazuje opće zaglavlje X-Signature, jer ne postoji zajednički standard.

Usporedba u konstantnom vremenu

Poslužitelj koji potpise uspoređuje običnom usporedbom nizova staje kod prvog različitog znaka. Mjerenjem vremena odgovora napadač bi mogao pogoditi valjan potpis znak po znak. Usporedba u ovom alatu ispituje svaki bajt bez obzira na rezultat, kao što bi poslužitelj trebao raditi 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 poslužitelj?

Uobičajeni uzroci su drukčija poruka (poslužitelj potpisuje sirovo tijelo, a ti si zalijepio preformatirani JSON, ili se razlikuju prijelomi redaka), ključ u pogrešnom Format ključa ili drugi algoritam. Čak i jedan suvišan razmak mijenja cijeli rezultat.

Treba li izlaz biti hex ili Base64?

Oboje kodira iste bajtove. GitHub koristi hex, dok mnogi drugi API-ji, poput Shopifyja, koriste Base64. Upotrijebi format koji očekuje sustav koji prima potpis.

Mogu li koristiti prazan ključ?

Alat ga prihvaća i upozorava te: s praznim ključem svatko može izračunati isti HMAC pa on ništa ne dokazuje.

Je li HMAC-SHA1 probijen kao SHA-1?

Napadi kolizijom na SHA-1 ne probijaju HMAC-SHA1, koji se kao MAC i dalje smatra sigurnim. Ostaje podržan za naslijeđene sustave poput starog zaglavlja X-Hub-Signature, ali novi sustavi trebaju koristiti HMAC-SHA256 ili jači.

Je li moj tajni ključ ovdje siguran?

Ključ i poruka obrađuju se samo u tvom pregledniku i nikamo se ne šalju. Ipak, s produkcijskom tajnom postupaj pažljivo i promijeni je ako sumnjaš da je razotkrivena.