Utilia

Generador d'HMAC

Calcula un HMAC-SHA1, SHA-256, SHA-384 o SHA-512 amb una clau en text, hex o Base64, obtén la sortida en hex i Base64 i comprova un webhook al navegador.

El missatge es signa exactament tal com s'ha escrit, codificat en UTF-8, amb els espais i els salts de línia.

La comparació s'executa en temps constant, com ho hauria de fer un servidor, de manera que el temps que triga no revela quants caràcters coincideixen.

Com calcular un HMAC

  1. Enganxa el Missatge. Per a un webhook, ha de ser el cos en brut de la petició, byte per byte.
  2. Introdueix la Clau secreta i tria’n el Format de la clau: Text (UTF-8), Hexadecimal o Base64.
  3. Tria l’Algorisme: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 o HMAC-SHA512.
  4. El resultat s’actualitza mentre escrius; també pots fer clic a Genera l’HMAC. Obtens l’HMAC (hex), l’HMAC (Base64) i una Capçalera de signatura de webhook (estil GitHub), cadascun amb un botó Copia.
  5. Per comprovar una signatura que has rebut, enganxa-la a Compara amb una signatura esperada (hex, Base64 o sha256=…). L’eina t’indica si coincideix.

El missatge es codifica en UTF-8 exactament tal com s’ha escrit, amb els espais i els salts de línia. El càlcul fa servir l’API Web Crypto del navegador; ni el missatge ni la clau surten mai del teu dispositiu.

Què és un HMAC

Un HMAC (codi d’autenticació de missatges basat en hash, RFC 2104) combina una clau secreta amb una funció de hash:

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

on K′ és la clau emplenada fins a la mida de bloc del hash (se’n calcula primer el hash si és més llarga), i ipad/opad són constants fixes. Només qui coneix la clau pot produir el codi correcte per a un missatge, i qualsevol canvi al missatge en canvia completament el codi. Per això els HMAC signen webhooks, peticions d’API (per exemple, AWS Signature Version 4) i els JSON Web Tokens HS256.

Un HMAC no és xifratge: el missatge no s’amaga. Tampoc és un hash de contrasenya; per desar contrasenyes, fes servir una funció lenta com bcrypt o Argon2.

La longitud de la sortida depèn de l’algorisme: 20 bytes per a SHA-1, 32 per a SHA-256, 48 per a SHA-384 i 64 per a SHA-512. HMAC-SHA1 encara es considera segur com a MAC, però per als sistemes nous és preferible SHA-256. Es recomana una clau aleatòria almenys tan llarga com la sortida (32 bytes per a HMAC-SHA256); les claus en hex o Base64 et permeten introduir directament aquests bytes aleatoris.

Com comprovar un webhook de GitHub

GitHub signa cada enviament amb el secret del teu webhook i envia el resultat a la capçalera X-Hub-Signature-256 com a sha256= seguit de l’HMAC-SHA256 en hex del cos. L’exemple de la documentació de GitHub fa servir el secret It's a Secret to Everybody i el cos Hello, World!; introdueix-los aquí amb HMAC-SHA256 i la capçalera mostra:

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

El camp de comparació accepta la línia sencera de la capçalera, el valor sha256=… o una signatura nua en hex o Base64 (Stripe, Shopify i Slack fan servir esquemes semblants amb les seves pròpies capçaleres i cadenes signades). Per a SHA-384 i SHA-512, l’eina mostra una capçalera genèrica X-Signature, ja que no hi ha cap estàndard comú.

Comparació en temps constant

Un servidor que compara signatures amb una comparació de cadenes normal s’atura al primer caràcter diferent. Mesurant els temps de resposta, un atacant podria endevinar una signatura vàlida caràcter a caràcter. La comparació d’aquesta eina examina tots els bytes sigui quin sigui el resultat, tal com hauria de fer un servidor amb crypto.timingSafeEqual a Node.js, hmac.compare_digest a Python o hash_equals a PHP.

Preguntes freqüents

Per què el meu HMAC és diferent del que calcula el meu servidor?

Les causes habituals són un missatge diferent (el servidor signa el cos en brut, mentre que tu has enganxat un JSON reformatat, o els salts de línia difereixen), una clau amb un Format de la clau equivocat o un altre algorisme. Fins i tot un sol espai de més canvia tot el resultat.

La sortida ha de ser en hex o en Base64?

Tots dos codifiquen els mateixos bytes. GitHub fa servir hex, mentre que moltes altres API, com Shopify, fan servir Base64. Fes servir el format que esperi el sistema receptor.

Puc fer servir una clau buida?

L’eina l’accepta i t’avisa: amb una clau buida, qualsevol pot calcular el mateix HMAC, de manera que no demostra res.

HMAC-SHA1 està trencat com SHA-1?

Els atacs de col·lisió contra SHA-1 no trenquen HMAC-SHA1, que encara es considera segur com a MAC. Continua sent compatible per a sistemes antics com la capçalera X-Hub-Signature antiga, però els sistemes nous haurien de fer servir HMAC-SHA256 o superior.

Està segura aquí la meva clau secreta?

La clau i el missatge només es processen al teu navegador i no s’envien enlloc. Tot i així, tracta amb cura un secret de producció i canvia’l si creus que ha quedat exposat.