Utilia

HMAC generator

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

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

Poređenje se izvršava u konstantnom vremenu, kako bi to trebao raditi server, pa utrošeno vrijeme ne otkriva koliko se znakova poklapa.

Kako izračunati HMAC

  1. Zalijepi Poruku. Za webhook to mora biti sirovo tijelo zahtjeva, bajt po bajt.
  2. Unesi 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 ažurira dok tipkaš; možeš kliknuti i Generiši HMAC. Dobijaš HMAC (heks), HMAC (Base64) i Zaglavlje potpisa webhooka (GitHub stil), svaki s dugmetom Kopiraj.
  5. Da provjeriš potpis koji si primio, zalijepi ga u Uporedi s očekivanim potpisom (heks, Base64 ili sha256=…). Alat kaže odgovara li.

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

Šta je HMAC

HMAC (hash-based message authentication code, RFC 2104) kombinuje tajni ključ s heš funkcijom:

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

gdje je K′ ključ dopunjen do veličine bloka heš funkcije (prvo se hešira ako je duži), a ipad/opad su fiksne konstante. Samo onaj ko zna ključ može proizvesti ispravan kod za poruku, a svaka promjena poruke potpuno mijenja kod. Zato HMAC-ovi potpisuju webhookove, API zahtjeve (na primjer AWS Signature Version 4) i JSON Web Tokene HS256.

HMAC nije šifrovanje: poruka nije skrivena. Nije ni heš lozinke; za pohranu lozinki koristi spor algoritam poput bcrypta 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 sigurnim kao MAC, ali za nove sisteme preferiraj SHA-256. Preporučuje se nasumičan ključ barem jednake dužine kao izlaz (32 bajta za HMAC-SHA256); heks ili Base64 ključevi omogućavaju direktan unos takvih nasumičnih bajtova.

Provjera GitHub webhooka

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

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

Polje za poređenje prihvata cijeli red zaglavlja, vrijednost sha256=… ili goli heks ili Base64 potpis (Stripe, Shopify i Slack koriste slične šeme s vlastitim zaglavljima i potpisanim nizovima). Za SHA-384 i SHA-512 alat prikazuje generičko 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. Mjerenjem vremena odgovora napadač bi mogao pogoditi ispravan potpis znak po znak. Poređenje u ovom alatu provjerava svaki bajt bez obzira na rezultat, kao što bi server 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 računa moj server?

Uobičajeni uzroci su drugačija poruka (server potpisuje sirovo tijelo, a ti si zalijepio preformatirani JSON, ili se razlikuju prelomi redova), ključ u pogrešnom Formatu ključa ili drugi algoritam. Čak i jedan suvišni razmak mijenja cijeli rezultat.

Treba li izlaz biti 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 koristiti prazan ključ?

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

Je li HMAC-SHA1 probijen kao SHA-1?

Napadi kolizijama na SHA-1 ne probijaju HMAC-SHA1, koji se i dalje smatra sigurnim kao MAC. I dalje je podržan za naslijeđene sisteme, poput starog zaglavlja X-Hub-Signature, ali novi sistemi 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 nikada se nigdje ne šalju. Ipak, s produkcijskom tajnom postupaj pažljivo i zamijeni je ako sumnjaš da je izložena.