Skip to content

Generatore HMAC e Verificatore di Firma

Generatore e verificatore HMAC online e gratuito. Calcola HMAC-SHA256/SHA1/SHA384/SHA512 con chiavi in Testo, Hex o Base64 e output Hex/Base64/Base64URL. 100% nel tuo browser — le chiavi non lasciano mai la pagina.

Niente tracciamento Funziona nel browser Gratuito
100% nel tuo browser — il tuo messaggio e la tua chiave segreta non lasciano mai il tuo dispositivo.
HMAC generato

Cos'è un HMAC?

Un HMAC (Hash-based Message Authentication Code) è un tag breve e di lunghezza fissa che dimostra che un messaggio è al tempo stesso non modificato e autentico — che è stato prodotto da qualcuno che possiede una chiave segreta condivisa. Definito nella RFC 2104 e nella FIPS 198-1, l'HMAC combina una qualsiasi funzione di hash crittografica con una chiave segreta in una specifica costruzione annidata, scritta come HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). L'hash interno lega la chiave al messaggio; l'hash esterno avvolge il risultato, ed è ciò che rende l'HMAC resistente agli attacchi di estensione della lunghezza che colpiscono le funzioni SHA-1 e SHA-256 grezze.

L'HMAC è ovunque nell'infrastruttura web moderna. Firma i webhook così puoi confermare che una richiesta in arrivo provenga davvero da GitHub, Stripe, Slack o Twilio e non sia stata falsificata. Firma le richieste API (AWS Signature Version 4 è costruito su HMAC-SHA256) così un server può autenticare il chiamante senza inviare una password sulla rete. È la S di HS256: un JWT firmato con HS256 porta un HMAC-SHA256 sul suo header e payload, che puoi ispezionare con il codificatore JWT. Sostiene anche la derivazione delle chiavi del TLS (HKDF), gli algoritmi di password monouso (HOTP/TOTP) e l'integrità dei messaggi in innumerevoli servizi interni.

Questo strumento calcola l'HMAC interamente nel tuo browser usando crypto.subtle.sign('HMAC', ...) della Web Crypto API — la stessa primitiva che i browser usano durante gli handshake TLS. La tua chiave segreta e il messaggio non vengono mai caricati, quindi è sicuro per i segreti di firma di produzione. Poiché lo stesso segreto può essere espresso come testo grezzo, hex o base64, lo strumento ti lascia scegliere esplicitamente la Codifica della chiave e, poiché provider diversi si aspettano il tag in forme diverse, puoi produrre Hex, Base64 o Base64URL. La scheda Verifica ti permette di controllare una firma che hai ricevuto, usando un confronto a tempo costante così che il controllo stesso non riveli informazioni di temporizzazione.

const crypto = require('crypto');

// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
  .createHmac('sha256', 'my-secret-key')
  .update('Hello, World!')
  .digest('hex');

console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'

// Verify a signature in constant time
function verify(message, key, expectedHex) {
  const actual = crypto.createHmac('sha256', key).update(message).digest();
  const expected = Buffer.from(expectedHex, 'hex');
  return actual.length === expected.length &&
    crypto.timingSafeEqual(actual, expected);
}

Caratteristiche Principali

Genera e verifica in un solo strumento

Genera una firma nella scheda Genera, oppure incolla un HMAC atteso nella scheda Verifica per autenticare un webhook o token in arrivo. La verifica usa un confronto a tempo costante così il risultato non rivela mai informazioni di temporizzazione.

Scegli la codifica della chiave

Interpreta il tuo segreto come Testo (UTF-8), Esadecimale o Base64. Questa è l'impostazione che la maggior parte degli altri strumenti omette — e il motivo più comune per cui due sistemi calcolano HMAC diversi per la stessa chiave.

Tre codifiche di output

Produci il tag come Hex (webhook di GitHub, AWS), Base64 (Stripe, Twilio, molte API) o Base64URL (JWT e token sicuri per URL) così corrisponde alla tua integrazione senza conversioni manuali.

Quattro algoritmi nativi

HMAC-SHA256 di default, più SHA-1, SHA-384 e SHA-512. Tutti girano sulla Web Crypto API del browser, quindi non c'è alcuna libreria crittografica in JavaScript di cui fidarsi né penalità di prestazioni.

100% lato client e privato

La tua chiave segreta e il messaggio vengono elaborati interamente nel tuo browser e non vengono mai inviati ad alcun server. Apri la scheda Rete e vedrai zero richieste in uscita — sicuro per i segreti di firma di produzione.

Calcolo in tempo reale

L'HMAC si ricalcola istantaneamente mentre modifichi il messaggio, la chiave, la codifica o l'algoritmo — senza il giro di andata e ritorno di un pulsante Genera, così puoi sperimentare con le codifiche finché il tuo valore corrisponde a quello del server.

Basato su vettori testati

L'output è validato rispetto ai vettori di test HMAC ufficiali della RFC 4231, così puoi fidarti che i digest corrispondano a ciò che producono OpenSSL, il modulo crypto di Node e la libreria hmac di Python.

Esempi di HMAC

Avvio rapido — HMAC-SHA256, output hex

Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699

Con la chiave "my-secret-key" (Codifica della chiave = Testo), algoritmo HMAC-SHA256 e Formato di output = Hex, il messaggio "Hello, World!" produce cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. Questo è il digest hex canonico di 64 caratteri che ottieni da crypto.createHmac('sha256', key).update(msg).digest('hex') di Node.

Verificare un webhook in stile Stripe (output Base64)

{"id":42,"event":"user.created"}
Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=

Molti provider di webhook inviano la firma come Base64. Con la chiave "whsec_test_secret" (Testo), HMAC-SHA256 e Formato di output = Base64, il corpo JSON si firma come Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Incolla quel valore nella scheda Verifica per confermare che la richiesta provenga davvero dal tuo provider prima di elaborarla. Internamente l'HMAC gira sulla stessa primitiva del nostro generatore di hash SHA-256, ma con la chiave del tuo segreto.

Vettore di riferimento RFC 4231

what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843

Questo è il caso di test 2 della RFC 4231, il documento ufficiale dei vettori di test HMAC. Con la chiave "Jefe" (Testo), HMAC-SHA256 e output Hex, il messaggio "what do ya want for nothing?" produce 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Far corrispondere esattamente questo valore è il modo in cui dimostri che un'implementazione HMAC è corretta.

HMAC-SHA512 per un digest più lungo

The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e

Passa l'algoritmo a HMAC-SHA512 per un digest di 128 caratteri (512 bit). Con la chiave "key" (Testo) e output Hex, "The quick brown fox" produce il valore qui sopra. SHA-512 è più veloce di SHA-256 sulla maggior parte dell'hardware a 64 bit e fornisce un output più grande, anche se SHA-256 resta il valore predefinito per l'interoperabilità.

Come Generare e Verificare un HMAC

  1. 1

    Scegli l'algoritmo

    Scegli HMAC-SHA256 (il valore predefinito e la scelta giusta per quasi tutti i webhook, le API e i JWT), oppure passa a SHA-1, SHA-384 o SHA-512 per corrispondere a un sistema che lo richiede. Tutti e quattro girano nativamente nel tuo browser tramite la Web Crypto API.

  2. 2

    Inserisci la chiave segreta e imposta la sua codifica

    Digita o incolla la tua chiave segreta, poi imposta la Codifica della chiave in modo che corrisponda a come il server la interpreta: Testo (UTF-8) per una stringa semplice, Hex per un blob esadecimale o Base64 per un segreto in base64. Sbagliare questo è la causa principale delle discrepanze HMAC, quindi nel dubbio provale tutte e tre.

  3. 3

    Inserisci il messaggio

    Incolla i byte esatti che vuoi firmare — per un webhook questo è il corpo grezzo della richiesta, byte per byte, senza ri-serializzazione né modifiche agli spazi. L'HMAC si ricalcola in tempo reale mentre modifichi, senza che nulla venga inviato a un server.

  4. 4

    Scegli il formato di output e copia

    Seleziona Hex (stile GitHub), Base64 (stile Stripe/AWS) o Base64URL (stile JWT) per corrispondere a ciò che la tua integrazione si aspetta, poi clicca su Copia per prendere la firma.

  5. 5

    Verifica una firma esistente

    Passa alla scheda Verifica, incolla l'HMAC atteso da un header o token e lo strumento conferma in tempo costante se la tua firma calcolata corrisponde — così puoi autenticare un payload prima di agire su di esso.

Errori Comuni con l'HMAC

Discrepanza nella codifica della chiave (causa nº 1 delle discrepanze)

Lo stesso segreto può essere letto come testo UTF-8 grezzo, come hex o come base64 — e ogni interpretazione produce byte di chiave completamente diversi, quindi l'HMAC non corrisponderà se il tuo strumento e il server non concordano. Se un provider ti dà un segreto in hex o base64, devi decodificarlo in byte prima di firmare, non firmare la stringa così com'è. Quando una firma non passa la verifica, prova prima la chiave in tutte e tre le opzioni di Codifica della chiave.

✗ Errato
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg)
✓ Corretto
// Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg)

Discrepanza nella codifica dell'output

Un HMAC sono byte grezzi; hex, base64 e base64url sono solo codifiche di testo diverse dello stesso valore. Se il server invia una firma in base64 e la confronti con il tuo digest in hex, non corrisponderanno mai anche se i byte sottostanti sono identici. Fai corrispondere il Formato di output a ciò che usa l'header o il token.

✗ Errato
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual   = digest('hex') // hex — never matches
✓ Corretto
// Produce the same encoding the provider uses
actual = digest('base64')

Firmare JSON ri-serializzato invece del corpo grezzo

Le firme dei webhook coprono i byte esatti che il provider ha inviato. Se fai il parse del JSON e lo ri-stringifichi, l'ordine delle chiavi, la spaziatura e la formattazione dei numeri possono cambiare, alterando i byte e rompendo la firma. Fai sempre l'HMAC del corpo grezzo della richiesta catturato prima di qualsiasi parsing.

✗ Errato
// Re-serialization changes the bytes
body = JSON.stringify(JSON.parse(rawBody))
verify(hmac(body))
✓ Corretto
// Sign the raw bytes exactly as received
verify(hmac(rawBody))

Usare == invece di un confronto a tempo costante

Confrontare la firma ricevuta con == o con la semplice uguaglianza tra stringhe rivela informazioni di temporizzazione, perché il confronto si ferma al primo byte diverso. Nell'arco di molti tentativi un attaccante può recuperare un tag valido. Usa sempre un controllo di uguaglianza a tempo costante quando verifichi.

✗ Errato
if (received === computed) { /* trust */ }
✓ Corretto
if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ }

A Cosa Serve l'HMAC

Verificare le firme dei webhook
Provider come GitHub, Stripe, Slack e Twilio firmano ogni webhook con HMAC sul corpo della richiesta e un segreto che solo tu condividi. Ricalcola il tag e confrontalo con l'header (per esempio X-Hub-Signature-256) per confermare che l'evento è autentico prima di agire su di esso. Usa la scheda Verifica per farlo senza scrivere codice usa e getta.
Firmare le richieste API
Le API autenticate spesso richiedono che il client firmi la richiesta con HMAC (metodo, percorso, timestamp, corpo) con un segreto condiviso invece di inviare il segreto stesso. AWS Signature Version 4 è l'esempio canonico. Questo strumento ti permette di riprodurre e fare il debug di quelle firme passo dopo passo.
Garantire l'integrità del messaggio
Quando passi un token, un cookie o un messaggio tra servizi, allegare un HMAC permette al destinatario di rilevare qualsiasi manomissione. Poiché il tag dipende da un segreto, un attaccante non può ricalcolarlo dopo aver modificato i dati — a differenza di un semplice checksum.
Capire la firma HS256 del JWT
Un JWT firmato con HS256 è semplicemente base64url(header) + '.' + base64url(payload), firmato con HMAC-SHA256 e il risultato emesso come Base64URL. Imposta l'algoritmo su SHA-256 e l'output su Base64URL qui per vedere esattamente come viene prodotta quella firma, poi ricontrolla nel codificatore JWT.
Fare il debug di una firma che non corrisponde
Quando il tuo HMAC non corrisponde a quello del server, questo strumento è il modo più rapido per isolare il perché: prova la chiave come Testo, Hex e Base64, alterna l'output tra Hex e Base64 e conferma di star firmando esattamente i byte grezzi — il tutto senza ridistribuire alcun codice.

Come Funziona l'HMAC

Costruzione della RFC 2104
L'HMAC è definito come H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), dove ipad è il byte 0x36 ripetuto e opad è 0x5c ripetuto, entrambi fino alla dimensione del blocco dell'hash. Una chiave più lunga della dimensione del blocco viene prima sottoposta a hash; una chiave più corta viene riempita con zeri. Questo annidamento a due passaggi è ciò che dà all'HMAC la sua prova di sicurezza, che vale anche se l'hash sottostante non è resistente alle collisioni.
Perché un hash con chiave batte un hash semplice
Un hash semplice dimostra solo che i dati non sono stati corrotti per caso, perché chiunque può ricalcolarlo per qualsiasi messaggio — incluso uno manomesso. L'HMAC mescola un segreto, così solo chi possiede la chiave può produrre un tag valido. Questo converte la sola integrità in integrità più autenticità, che è la proprietà di cui i webhook e le richieste firmate hanno effettivamente bisogno.
Resistenza all'estensione della lunghezza
SHA-1, SHA-256 e SHA-512 nudi sono hash di Merkle–Damgård vulnerabili all'estensione della lunghezza: dato H(segreto ‖ msg) un attaccante può calcolare H(segreto ‖ msg ‖ extra) senza conoscere il segreto. Gli schemi ingenui di 'MAC con prefisso segreto' vengono rotti da questo. L'hash esterno dell'HMAC neutralizza l'attacco, ed è il motivo principale per usare l'HMAC invece di sottoporre a hash un segreto e un messaggio insieme.
Scegliere SHA-256 vs SHA-512
L'HMAC-SHA256 produce un tag di 256 bit (64 caratteri hex) ed è il valore predefinito per l'interoperabilità — veloce, onnipresente e supportato ovunque. L'HMAC-SHA512 produce un tag di 512 bit (128 caratteri hex) ed è spesso più veloce su CPU a 64 bit perché SHA-512 usa parole a 64 bit. Scegli SHA-256 a meno che una specifica o un sistema partner richieda SHA-512; entrambi sono sicuri per l'autenticazione.
Implementazione con Web Crypto
Questo strumento chiama crypto.subtle.importKey per caricare la tua chiave (decodificata da Testo, Hex o Base64) e crypto.subtle.sign('HMAC', ...) per calcolare il tag, poi codifica i byte grezzi come Hex, Base64 o Base64URL. È la stessa implementazione nativa e sottoposta ad audit che il browser usa per il TLS, eseguita al di fuori del motore JavaScript per la velocità.

Buone Pratiche per l'HMAC

Usa una chiave lunga almeno quanto l'output dell'hash
Per HMAC-SHA256 usa un segreto di almeno 32 byte casuali (256 bit); per SHA-512 usane 64. Una chiave corta o a bassa entropia è l'anello più debole. Genera le chiavi da una fonte casuale crittograficamente sicura — mai una password o una stringa prevedibile.
Confronta sempre i tag in tempo costante
Verifica le firme con un confronto a tempo costante (crypto.timingSafeEqual in Node, hmac.compare_digest in Python) invece di == o dell'uguaglianza tra stringhe. Un confronto ingenuo si ferma presto al primo byte diverso, rivelando una temporizzazione che può permettere a un attaccante di recuperare un tag valido byte per byte. La scheda Verifica di questo strumento confronta già in tempo costante.
Non registrare né esporre mai la chiave segreta
Tieni i segreti di firma fuori dai log, dai messaggi di errore, dagli URL e dal codice lato client. Conservali in un gestore di segreti o in variabili d'ambiente, ruotali periodicamente e assegna a ogni integrazione la propria chiave così che una fuga non comprometta tutto.
Preferisci HMAC-SHA256 o più forte
Usa HMAC-SHA256 come default; sali a SHA-384 o SHA-512 quando un partner lo richiede. Evita HMAC-SHA1 nei sistemi nuovi e non usare mai HMAC-MD5. Anche se l'HMAC tollera un hash più debole meglio di quanto farebbe una firma pura, partire da un hash moderno ti dà il massimo margine.
Firma i byte esatti, incluso un timestamp
Firma il payload grezzo e non modificato — ri-serializzare il JSON o togliere gli spazi cambia i byte e rompe la verifica. Per firmare le richieste, includi un timestamp o un nonce nei dati firmati e rifiuta le firme datate per prevenire gli attacchi di replay.

Domande Frequenti sull'HMAC

Cos'è l'HMAC?
HMAC (Hash-based Message Authentication Code) è un modo per dimostrare sia l'integrità sia l'autenticità di un messaggio usando una chiave segreta condivisa. Passi un messaggio e una chiave segreta a una funzione di hash (qui SHA-1, SHA-256, SHA-384 o SHA-512) nella specifica costruzione annidata definita dalla RFC 2104 e ottieni un tag di lunghezza fissa. Chiunque conosca il segreto può ricalcolare il tag e confermare che il messaggio non è stato alterato e proviene da qualcuno che possiede la chiave. È il meccanismo standard dietro le firme dei webhook, le richieste API firmate e la famiglia HS256 dei token JWT.
In cosa differisce l'HMAC da un hash semplice come SHA-256?
Un hash semplice come SHA-256 dimostra solo l'integrità: chiunque può ricalcolarlo, quindi chiunque può anche falsificare un hash corrispondente per un messaggio manomesso. L'HMAC mescola una chiave segreta, così solo le parti che possiedono quella chiave possono produrre o verificare un tag valido — questo aggiunge autenticità all'integrità. L'HMAC usa anche una costruzione annidata a due passaggi (hashing interno ed esterno con pad derivati dalla chiave) che lo rende immune agli attacchi di estensione della lunghezza che colpiscono SHA-1 e SHA-256 grezzi. In breve: usa un hash per rilevare una corruzione accidentale, usa l'HMAC per rilevare una manomissione deliberata da parte di un attaccante che non conosce la tua chiave.
Come verifico la firma di un webhook in arrivo?
Prendi il corpo grezzo della richiesta esattamente come ricevuto (non ri-serializzare il JSON — anche chiavi riordinate rompono la firma), seleziona lo stesso algoritmo usato dal tuo provider (di solito HMAC-SHA256), inserisci il tuo segreto di firma con la Codifica della chiave corretta e imposta il Formato di output in modo che corrisponda all'header (Hex per il prefisso sha256= di GitHub, Base64 per gli header in stile Stripe/Twilio). Poi apri la scheda Verifica, incolla la firma dall'header (come X-Hub-Signature-256) e lo strumento segnala se corrisponde o no usando un confronto a tempo costante. Fidati del payload solo se corrisponde.
Quale codifica della chiave e dell'output usa il mio server?
Non c'è una risposta universale — dipende dal tuo provider, ed è esattamente per questo che questo strumento espone entrambe come scelte esplicite. Schemi comuni: GitHub usa un segreto di testo UTF-8 e output hex minuscolo con prefisso sha256=; Stripe usa un segreto di testo e base64; AWS Signature V4 usa chiavi binarie derivate ed hex; molti sistemi interni distribuiscono segreti in base64 o hex che devono essere decodificati in byte grezzi prima di firmare. Se il tuo HMAC non corrisponde, la codifica è quasi sempre la colpevole — prova la stessa chiave in Testo, Hex e Base64 per trovare l'interpretazione che il server si aspetta.
L'HMAC-SHA256 è sicuro?
Sì. L'HMAC-SHA256 è ampiamente considerato sicuro ed è il valore predefinito consigliato per l'autenticazione dei messaggi. La sua sicurezza deriva dalla costruzione HMAC più un hash sottostante robusto, e resta sicuro anche se esistono attacchi di collisione contro l'hash nudo — l'HMAC non si affida alla resistenza alle collisioni come fa una firma digitale. I rischi reali sono operativi, non algoritmici: una chiave segreta debole o trapelata, registrare la chiave nei log o usare un confronto non a tempo costante. Usa una chiave lunga e casuale, confronta i tag in tempo costante e l'HMAC-SHA256 reggerà.
Perché qui non c'è HMAC-MD5 o HMAC-SHA-3?
È una scelta progettuale. Questo strumento espone solo SHA-1, SHA-256, SHA-384 e SHA-512 perché sono le funzioni di hash supportate dalla Web Crypto API nativa del browser, il che mantiene tutto veloce e interamente lato client, senza librerie aggiuntive. L'HMAC-MD5 è omesso perché MD5 è obsoleto e non dovresti avviare sistemi nuovi con esso. L'HMAC-SHA-3 è omesso perché la Web Crypto non implementa SHA-3; aggiungerlo richiederebbe di includere un polyfill in JavaScript. Per praticamente tutti i casi d'uso moderni l'HMAC-SHA256 è comunque la scelta corretta.
HS256 (HMAC) vs RS256 (RSA) — quale usare per i JWT?
HS256 firma e verifica un JWT con un unico segreto condiviso usando HMAC-SHA256, mentre RS256 firma con una chiave privata RSA e verifica con la chiave pubblica corrispondente. Usa HS256 quando una sola parte emette e convalida i token (un monolite, o servizi interni fidati che possono condividere il segreto in sicurezza) — è più semplice e veloce. Usa RS256 quando terze parti o molti servizi devono verificare i token ma non devono poterli coniare, dato che puoi distribuire solo la chiave pubblica. Puoi esplorare la struttura codificata di entrambi nel codificatore JWT; la firma HS256 è esattamente un HMAC-SHA256 sull'header e sul payload.

Strumenti correlati

Vedi tutti gli strumenti →