Autenticazione HMAC
HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m)), dove K' è la chiave adattata alla dimensione del blocco di H
Calcola l’HMAC di un messaggio con una chiave segreta, in esadecimale o Base64, e confrontalo con una firma attesa (prefisso sha256= accettato) per verificare un webhook di GitHub, Stripe o Shopify.
Esadecimale o Base64, con o senza prefisso come sha256=.
Questo strumento calcola l’HMAC di un messaggio con una chiave segreta, con SHA-1, SHA-256, SHA-384 o SHA-512, e lo confronta con una firma attesa. È pensato soprattutto per gli sviluppatori che integrano o fanno il debug di webhook GitHub, Stripe o Shopify e vogliono capire se l’errore dipende dal segreto, dal corpo del messaggio o dal proprio codice.
Un HMAC (RFC 2104, FIPS 198-1) combina una funzione di hash con una chiave segreta: HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Questo doppio passaggio rende impossibile produrre il valore senza la chiave ed evita l’attacco di estensione della lunghezza che colpisce un semplice SHA-256(chiave ‖ messaggio). Con la chiave «key» e il messaggio «The quick brown fox jumps over the lazy dog», HMAC-SHA-256 dà f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 in esadecimale, cioè 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg= in Base64. La chiave viene usata così come la digiti, messaggio e chiave sono codificati in UTF-8 e il calcolo passa per la Web Crypto API del browser.
La maggior parte dei fornitori firma il corpo grezzo della richiesta. GitHub invia X-Hub-Signature-256: sha256=<hex>, Shopify invia X-Shopify-Hmac-Sha256 in Base64, mentre Stripe firma la stringa «timestamp.corpo» e mette il valore esadecimale dopo v1= nell’header Stripe-Signature. Scegli quindi l’output esadecimale o Base64 in base al fornitore, poi incolla la firma ricevuta nel campo facoltativo: prefissi come «sha256=» sono accettati e il risultato si aggiorna mentre scrivi. Il confronto avviene in tempo costante, come raccomanda GitHub per il codice lato server.
Incolla il messaggio esatto da firmare, per esempio il corpo grezzo di un webhook, poi la chiave segreta condivisa.
Seleziona SHA-1, SHA-256, SHA-384 o SHA-512 e un output esadecimale o Base64 in base a ciò che si aspetta il servizio.
Se serve, incolla la firma attesa, con o senza un prefisso come sha256=: l’HMAC e l’esito della verifica si aggiornano mentre scrivi.
HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m)), dove K' è la chiave adattata alla dimensione del blocco di H
Copia il payload grezzo e l’header X-Hub-Signature-256 dalla scheda Recent Deliveries del webhook, inserisci il segreto e confronta. Se il valore coincide qui ma non sul tuo server, è il tuo framework a modificare il corpo prima della verifica.
Ricostruisci la stringa firmata «t.corpo» dall’header Stripe-Signature e dal corpo grezzo, calcola l’HMAC-SHA-256 con il tuo segreto whsec_… e confrontalo con il valore v1 per capire perché la verifica fallisce.
Shopify firma il corpo grezzo con HMAC-SHA-256 e invia il risultato in Base64 nell’header X-Shopify-Hmac-Sha256. Scegli l’output Base64 e incolla l’header per confermare di usare il segreto dell’app corretto.
Input
Messaggio: The quick brown fox jumps over the lazy dog; Chiave segreta: key; Algoritmo: SHA-256; Codifica: EsadecimaleRisultato
Firma calcolata: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8Chiunque può calcolare un hash come SHA-256: dimostra l’integrità, non l’origine. Un HMAC aggiunge una chiave segreta, quindi solo chi possiede quella chiave può produrre il valore corretto. Per questo autentica il mittente oltre a rilevare qualsiasi modifica.
Quasi sempre il corpo è stato modificato prima del calcolo: JSON analizzato e riserializzato dal framework, codifica diversa o spazi aggiunti. Altre cause frequenti sono un segreto sbagliato (quello di test invece di quello di produzione), un formato di output errato (hex invece di Base64) o, per Stripe, l’aver dimenticato il timestamp nella stringa firmata.
Per autenticare messaggi sì: le collisioni di SHA-1 non permettono di falsificare un HMAC-SHA-1 senza la chiave, e viene ancora usato, per esempio da TOTP. Per ogni nuovo sistema preferisci comunque HMAC-SHA-256, ormai lo standard dei webhook. GitHub mantiene l’header X-Hub-Signature in SHA-1 solo per compatibilità.
La RFC 2104 raccomanda una chiave lunga almeno quanto l’output dell’hash, cioè 32 byte per HMAC-SHA-256. Una chiave più lunga del blocco (64 byte per SHA-256) viene prima sottoposta a hash e quindi non aggiunge sicurezza. Generala in modo casuale invece di scegliere una password.
No, un HMAC non è una cifratura: non contiene il messaggio e non permette di ricostruirlo. Del resto il messaggio viene di solito inviato in chiaro accanto alla firma. Per rendere un contenuto illeggibile serve una cifratura come AES-GCM.
Il calcolo avviene solo nel tuo browser con Web Crypto: né la chiave né il messaggio vengono trasmessi. Per principio, però, usa un segreto di test o ruota il segreto dopo una sessione di debug su un computer condiviso.
Strumenti correlati
Strumenti simili o complementari a questo.
Calcola in un colpo solo gli hash MD5, SHA-1, SHA-256, SHA-384 e SHA-512 di un testo o di un file.
Verifica se due hash o somme di controllo coincidono, indipendentemente da maiuscole, spazi o due punti.
Genera token casuali sicuri da 8 a 256 byte in esadecimale, Base64 o Base64URL, con prefisso opzionale.
Distingui hash, cifratura e firma e usa le impronte per verificare uguaglianza o integrità senza attribuire false garanzie.
Scopri quando usare crittografia, hashing, HMAC o PBKDF2 per riservatezza, integrità, autenticazione e password.
Comprendi come si collegano OAuth 2.0, PKCE, JWT, JWK e JWKS: autorizzazione, token, chiavi pubbliche e verifica.
Scopri come SRI usa un'impronta crittografica per verificare che uno script o un foglio di stile esterno corrisponda al file previsto.