Generatore HMAC
Calcola un HMAC-SHA1, SHA-256, SHA-384 o SHA-512 con chiave testo, hex o Base64, ottieni output hex e Base64 e verifica la firma di un webhook nel browser.
Il messaggio viene firmato esattamente come è scritto, codificato in UTF-8, spazi e a capo compresi.
- HMAC (hex)
- HMAC (Base64)
- Header di firma del webhook (stile GitHub)
Il confronto avviene in tempo costante, come dovrebbe fare un server, quindi il tempo impiegato non rivela quanti caratteri corrispondono.
Come calcolare un HMAC
- Incolla il Messaggio. Per un webhook dev’essere il body grezzo della richiesta, byte per byte.
- Inserisci la Chiave segreta e scegli il suo Formato della chiave: Testo (UTF-8), Esadecimale o Base64.
- Scegli l’Algoritmo: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 o HMAC-SHA512.
- Il risultato si aggiorna mentre scrivi; puoi anche cliccare su Genera HMAC. Ottieni l’HMAC (hex), l’HMAC (Base64) e un Header di firma del webhook (stile GitHub), ognuno con il suo pulsante Copia.
- Per controllare una firma che hai ricevuto, incollala in Confronta con una firma attesa (hex, Base64 o sha256=…). Lo strumento ti dice se corrisponde.
Il messaggio viene codificato in UTF-8 esattamente come è scritto, spazi e a capo compresi. Il calcolo usa la Web Crypto API del tuo browser; il messaggio e la chiave non lasciano mai il tuo dispositivo.
Che cos’è un HMAC
Un HMAC (hash-based message authentication code, RFC 2104) combina una chiave segreta con una funzione di hash:
HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))
dove K′ è la chiave riempita fino alla dimensione del blocco dell’hash (e prima sottoposta a hash se è più lunga), mentre ipad e opad sono costanti fisse. Solo chi conosce la chiave può produrre il codice giusto per un messaggio, e qualsiasi modifica al messaggio cambia completamente il codice. Ecco perché gli HMAC firmano i webhook, le richieste alle API (per esempio AWS Signature Version 4) e i JSON Web Token HS256.
Un HMAC non è crittografia: il messaggio non viene nascosto. Non è nemmeno un hash per password; per salvare le password usa una funzione lenta come bcrypt o Argon2.
La lunghezza dell’output dipende dall’algoritmo: 20 byte per SHA-1, 32 per SHA-256, 48 per SHA-384 e 64 per SHA-512. HMAC-SHA1 è ancora considerato sicuro come MAC, ma per i nuovi sistemi preferisci SHA-256. Si consiglia una chiave casuale lunga almeno quanto l’output (32 byte per HMAC-SHA256); le chiavi in esadecimale o Base64 ti permettono di inserire direttamente questi byte casuali.
Verificare un webhook di GitHub
GitHub firma ogni consegna con il segreto del tuo webhook e invia il risultato nell’header X-Hub-Signature-256 come sha256= seguito dall’HMAC-SHA256 esadecimale del body. L’esempio della documentazione di GitHub usa il segreto It's a Secret to Everybody e il body Hello, World!; inseriscili qui con HMAC-SHA256 e l’header mostra:
X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17
Il campo di confronto accetta l’intera riga dell’header, il valore sha256=… oppure una firma esadecimale o Base64 senza prefisso (Stripe, Shopify e Slack usano schemi simili con i propri header e le proprie stringhe firmate). Per SHA-384 e SHA-512 lo strumento mostra un header generico X-Signature, perché non esiste uno standard comune.
Confronto in tempo costante
Un server che confronta le firme con un normale confronto di stringhe si ferma al primo carattere diverso. Misurando i tempi di risposta, un attaccante potrebbe indovinare una firma valida un carattere alla volta. Il confronto di questo strumento esamina ogni byte qualunque sia il risultato, come dovrebbe fare un server con crypto.timingSafeEqual in Node.js, hmac.compare_digest in Python o hash_equals in PHP.
Domande frequenti
Perché il mio HMAC è diverso da quello calcolato dal mio server?
Le cause tipiche sono un messaggio diverso (il server firma il body grezzo, mentre tu hai incollato un JSON riformattato, oppure gli a capo sono diversi), una chiave nel Formato della chiave sbagliato o un altro algoritmo. Anche un solo spazio in più cambia l’intero risultato.
L'output deve essere hex o Base64?
Entrambi codificano gli stessi byte. GitHub usa l’esadecimale, mentre molte altre API, come Shopify, usano Base64. Usa il formato che si aspetta il sistema che riceve.
Posso usare una chiave vuota?
Lo strumento la accetta e ti avvisa: con una chiave vuota chiunque può calcolare lo stesso HMAC, quindi non dimostra nulla.
HMAC-SHA1 è violato come SHA-1?
Gli attacchi a collisione su SHA-1 non violano HMAC-SHA1, che è ancora considerato sicuro come MAC. Resta supportato per i sistemi legacy, come il vecchio header X-Hub-Signature, ma i nuovi sistemi dovrebbero usare HMAC-SHA256 o algoritmi più robusti.
La mia chiave segreta è al sicuro qui?
La chiave e il messaggio vengono elaborati solo nel tuo browser e non vengono mai inviati altrove. Tratta comunque con cura un segreto di produzione e sostituiscilo se pensi che sia stato esposto.
Strumenti correlati
- Generatore di hash Genera hash MD5, SHA-1, SHA-256 e SHA-512 di testi o file di qualsiasi dimensione e verifica i checksum. Tutto avviene nel tuo browser.
- Decoder JWT Decodifica header e payload di un JWT, leggi exp, iat e nbf come date e verifica firme HS256, RS256, PS256, ES256 o EdDSA nel tuo browser.
- Codifica e decodifica Base64 Codifica e decodifica Base64 gratis, con pieno supporto UTF-8 e opzione base64url sicura per URL. Funziona tutto nel browser, nulla viene caricato.
- Generatore e verifica bcrypt Genera un hash bcrypt con fattore di costo da 4 a 14, verifica una password con un hash esistente e leggi versione, costo, salt e digest.