Utilia

Generator HMAC

Calculează HMAC-SHA1, SHA-256, SHA-384 sau SHA-512 cu o cheie text, hex sau Base64, obține rezultat hex și Base64 și verifică semnătura unui webhook în browser.

Mesajul este semnat exact așa cum este scris, codificat în UTF-8, inclusiv spațiile și rândurile noi.

Compararea se face în timp constant, așa cum ar trebui să o facă un server, astfel încât durata ei să nu dezvăluie câte caractere corespund.

Cum calculezi un HMAC

  1. Lipește Mesaj. Pentru un webhook, acesta trebuie să fie corpul brut al cererii, octet cu octet.
  2. Introdu Cheie secretă și alege Formatul cheii: Text (UTF-8), Hexazecimal sau Base64.
  3. Alege Algoritm: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 sau HMAC-SHA512.
  4. Rezultatul se actualizează pe măsură ce scrii; poți apăsa și Generează HMAC. Primești HMAC (hex), HMAC (Base64) și un Antet de semnătură pentru webhook (stil GitHub), fiecare cu un buton Copiază.
  5. Pentru a verifica o semnătură primită, lipește-o în Compară cu o semnătură așteptată (hex, Base64 sau sha256=…). Instrumentul îți spune dacă ea corespunde.

Mesajul este codificat în UTF-8 exact așa cum este scris, inclusiv spațiile și rândurile noi. Calculul folosește API-ul Web Crypto al browserului tău; mesajul și cheia nu părăsesc niciodată dispozitivul tău.

Ce este un HMAC

Un HMAC (hash-based message authentication code, RFC 2104) combină o cheie secretă cu o funcție de hash:

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

unde K′ este cheia completată până la dimensiunea blocului funcției de hash (procesată mai întâi cu hash, dacă este mai lungă), iar ipad/opad sunt constante fixe. Doar cine cunoaște cheia poate produce codul corect pentru un mesaj, iar orice schimbare a mesajului schimbă complet codul. De aceea HMAC-urile semnează webhook-uri, cereri către API-uri (de exemplu AWS Signature Version 4) și token-uri JSON Web Token HS256.

Un HMAC nu este criptare: mesajul nu este ascuns. Nu este nici un hash de parolă; pentru stocarea parolelor folosește o funcție lentă, precum bcrypt sau Argon2.

Lungimea rezultatului depinde de algoritm: 20 de octeți pentru SHA-1, 32 pentru SHA-256, 48 pentru SHA-384 și 64 pentru SHA-512. HMAC-SHA1 este încă considerat sigur ca MAC, dar pentru sisteme noi preferă SHA-256. Se recomandă o cheie aleatorie cel puțin la fel de lungă ca rezultatul (32 de octeți pentru HMAC-SHA256); cheile hex sau Base64 îți permit să introduci direct astfel de octeți aleatorii.

Verificarea unui webhook GitHub

GitHub semnează fiecare livrare cu secretul webhook-ului tău și trimite rezultatul în antetul X-Hub-Signature-256, sub forma sha256= urmat de HMAC-SHA256 hex al corpului. Exemplul din documentația GitHub folosește secretul It's a Secret to Everybody și corpul Hello, World!; introdu-le aici cu HMAC-SHA256 și antetul arată:

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

Câmpul de comparare acceptă linia întreagă a antetului, valoarea sha256=… sau o semnătură hex ori Base64 simplă (Stripe, Shopify și Slack folosesc scheme asemănătoare, cu propriile anteturi și șiruri semnate). Pentru SHA-384 și SHA-512, instrumentul afișează un antet generic X-Signature, deoarece nu există un standard comun.

Compararea în timp constant

Un server care compară semnăturile cu o comparație obișnuită de șiruri se oprește la primul caracter diferit. Măsurând timpii de răspuns, un atacator ar putea ghici o semnătură validă caracter cu caracter. Compararea din acest instrument examinează fiecare octet indiferent de rezultat, așa cum ar trebui să facă un server cu crypto.timingSafeEqual în Node.js, hmac.compare_digest în Python sau hash_equals în PHP.

Întrebări frecvente

De ce HMAC-ul meu diferă de cel calculat de serverul meu?

Cauzele obișnuite sunt un mesaj diferit (serverul semnează corpul brut, iar tu ai lipit un JSON reformatat sau rândurile noi diferă), o cheie în Formatul cheii greșit sau alt algoritm. Chiar și un singur spațiu în plus schimbă complet rezultatul.

Rezultatul trebuie să fie hex sau Base64?

Ambele codifică aceiași octeți. GitHub folosește hex, în timp ce multe alte API-uri, precum Shopify, folosesc Base64. Folosește formatul pe care îl așteaptă sistemul care primește semnătura.

Pot folosi o cheie goală?

Instrumentul o acceptă și te avertizează: cu o cheie goală, oricine poate calcula același HMAC, deci nu dovedește nimic.

Este HMAC-SHA1 compromis ca SHA-1?

Atacurile de coliziune asupra SHA-1 nu compromit HMAC-SHA1, care este încă considerat sigur ca MAC. Rămâne acceptat pentru sistemele vechi, precum vechiul antet X-Hub-Signature, dar sistemele noi ar trebui să folosească HMAC-SHA256 sau mai puternic.

Este cheia mea secretă în siguranță aici?

Cheia și mesajul sunt procesate doar în browserul tău și nu sunt trimise nicăieri. Totuși, tratează cu grijă un secret de producție și schimbă-l dacă crezi că a fost expus.