Vai al contenuto principale

Generatore e verificatore HMAC

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.

  • Appunti

Integra questo widget

Personalizza il risultato, controlla l’anteprima e copia il codice.

Anteprima

Tipo di codice di integrazione

Codice da copiare

Responsive e ridimensionato automaticamente da Bethemesh.

Firma HMAC

Esadecimale o Base64, con o senza prefisso come sha256=.

Questo strumento ti è stato utile?

Come funziona questo strumento?

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.

Come usare questo strumento

  1. Inserisci messaggio e chiave

    Incolla il messaggio esatto da firmare, per esempio il corpo grezzo di un webhook, poi la chiave segreta condivisa.

  2. Scegli algoritmo e formato

    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.

  3. Confronta con la firma ricevuta

    Se serve, incolla la firma attesa, con o senza un prefisso come sha256=: l’HMAC e l’esito della verifica si aggiornano mentre scrivi.

Autenticazione HMAC

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

Casi d’uso

Verificare un webhook GitHub

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.

Fare il debug di una firma Stripe

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.

Controllare un webhook Shopify

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.

Esempi

Firma HMAC-SHA256 di riferimento

Input

Messaggio: The quick brown fox jumps over the lazy dog; Chiave segreta: key; Algoritmo: SHA-256; Codifica: Esadecimale

Risultato

Firma calcolata: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

Consigli e buone pratiche

  • Firma il corpo grezzo esattamente com’è stato ricevuto: un JSON riformattato, reindentato o con le chiavi riordinate dà una firma completamente diversa.
  • Attenzione a spazi e a capo invisibili intorno al segreto: una chiave copiata con un a capo finale produce un altro HMAC.
  • Lato server, confronta sempre con una funzione a tempo costante (crypto.timingSafeEqual, hmac.compare_digest) e, per Stripe o Slack, rifiuta i timestamp troppo vecchi per bloccare gli attacchi di replay.

Fonti e riferimenti

Domande frequenti

Che differenza c’è tra un HMAC e un hash?

Chiunque 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.

Perché la firma del mio webhook non coincide?

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.

HMAC-SHA-1 è ancora sicuro?

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à.

Quanto deve essere lunga la chiave?

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.

Si può decifrare un HMAC per recuperare il messaggio?

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.

È prudente inserire qui un segreto di webhook di produzione?

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.

Strumenti simili

Calcola in un colpo solo gli hash MD5, SHA-1, SHA-256, SHA-384 e SHA-512 di un testo o di un file.

Sicurezza e privacyIn evidenzaUsa questo strumento

Verifica se due hash o somme di controllo coincidono, indipendentemente da maiuscole, spazi o due punti.

Sicurezza e privacyUsa questo strumento

Genera token casuali sicuri da 8 a 256 byte in esadecimale, Base64 o Base64URL, con prefisso opzionale.

Sicurezza e privacyUsa questo strumento