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.
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
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
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
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
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
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.
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg) // 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.
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual = digest('hex') // hex — never matches // 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.
// Re-serialization changes the bytes body = JSON.stringify(JSON.parse(rawBody)) verify(hmac(body))
// 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.
if (received === computed) { /* trust */ } 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?
In cosa differisce l'HMAC da un hash semplice come SHA-256?
Come verifico la firma di un webhook in arrivo?
Quale codifica della chiave e dell'output usa il mio server?
L'HMAC-SHA256 è sicuro?
Perché qui non c'è HMAC-MD5 o HMAC-SHA-3?
HS256 (HMAC) vs RS256 (RSA) — quale usare per i JWT?
Strumenti correlati
Vedi tutti gli strumenti →Generatore e verificatore di hash Bcrypt
Strumenti di sicurezza
Genera e verifica hash bcrypt delle password online: costo regolabile, prefissi $2b$/$2a$/$2y$. 100% nel tuo browser; la password non viene mai caricata.
Decodificatore JWT
Strumenti di sicurezza
Decodifica token JWT online con il nostro decodificatore JWT gratis. Ispeziona intestazione, payload, firma, scadenza e attestazioni. 100% browser — token mai fuori dal dispositivo. Nessuna registrazione, nessun tracciamento.
Codificatore e Generatore JWT
Strumenti di sicurezza
Generatore JWT online gratis. Costruisci header e payload, firma con HS256, RS256 o ES256 all'istante nel browser; segreto e chiave non lasciano il dispositivo.
Generatore di segreti JWT — HS256/384/512
Strumenti di sicurezza
Genera online un segreto JWT robusto e conforme alle RFC per HS256/384/512 — 100% nel tuo browser, mai inviato a un server. base64url, base64 o hex.
Generatore Hash MD5 e Strumento Checksum File
Strumenti di sicurezza
Genera hash MD5, SHA-256, SHA-1 e SHA-512 online gratis. Calcola l'hash di testo o file nel browser, verifica checksum e copia i risultati. Senza registrazione.
Generatore di Password Casuali — Personalizzabile e Sicuro
Strumenti di sicurezza
Genera password casuali sicure all'istante — gratis, 100% nel tuo browser. Personalizza lunghezza e caratteri, batch fino a 50 con analisi entropia.