MiServe DevTools

I tuoi adesivi

Fissa qui gli strumenti. Restano salvati in questo browser.

Generatore HMAC

Firma un messaggio con una chiave segreta usando HMAC-SHA256 o un altro hash, e verifica una firma che hai ricevuto.

HMAC (hex)
HMAC (Base64)

Funziona nel tuo browser con WebAssembly. Nulla di ciò che incolli viene caricato.

Informazioni su questo strumento

Che cosa dimostra un HMAC

HMAC (RFC 2104) combina un messaggio con una chiave segreta tramite una funzione di hash e restituisce un breve tag. Chi possiede la stessa chiave può ricalcolare il tag. Se i due tag sono uguali, il messaggio non è stato modificato lungo il percorso (integrità) ed è stato prodotto da qualcuno che conosce la chiave (autenticità).

Un semplice hash non può farlo, perché chi altera il messaggio può anche ricalcolarne l'hash. Un HMAC non nasconde il messaggio, quindi non è cifratura. E poiché entrambe le parti hanno la stessa chiave, non può dimostrare quale delle due abbia scritto il messaggio: per questo serve una firma digitale con una chiave privata.

Firme dei webhook

HMAC si incontra spesso nei webhook. Il provider firma il body della richiesta con un segreto che condivide con te e invia il tag in un header, e il tuo server calcola lo stesso HMAC prima di fidarsi della richiesta. GitHub invia X-Hub-Signature-256: sha256=… in hex, Shopify invia X-Shopify-Hmac-SHA256 in Base64, e Stripe firma il timestamp, un punto e il body, poi invia il risultato come v1=… dentro Stripe-Signature.

Firma i byte grezzi del body esattamente come sono arrivati. Se un framework fa il parsing del JSON e tu lo serializzi di nuovo, la spaziatura e l'ordine delle chiavi cambiano e l'HMAC non corrisponde più. Quando qui una firma non torna, controlla prima la codifica della chiave (testo, hex o Base64), poi un eventuale a capo finale nel messaggio.

Perché un server confronta in tempo costante

Un normale confronto tra stringhe si ferma al primo carattere diverso. Su un server, questo rende la risposta un po' più veloce quando i primi byte di una firma contraffatta sono sbagliati e un po' più lenta quando sono giusti, e un attaccante in grado di misurare la differenza può ricostruire un tag valido byte per byte. Un confronto in tempo costante legge tutti i byte, qualunque sia il risultato. Usa la funzione che offre la tua piattaforma: crypto.timingSafeEqual in Node.js, hmac.Equal in Go, hmac.compare_digest in Python, hash_equals in PHP.

Il campo di confronto di questa pagina funziona allo stesso modo: decodifica entrambi i valori in byte e li legge tutti. In una scheda del browser che contiene già entrambi i valori non c'è nessuna tempistica da nascondere, quindi qui ti dice soltanto se il tuo codice ha prodotto il tag giusto.

Come funziona

Il tag è calcolato dal package crypto/hmac di Go compilato in WebAssembly ed eseguito in un thread in background del browser. Il messaggio viene preso come UTF-8, senza aggiungere né togliere nulla. Una cosa però cambia: una casella di testo del browser conserva ogni a capo come un singolo line feed, quindi un messaggio arrivato con terminazioni di riga CRLF qui viene firmato con LF. La chiave viene presa come testo UTF-8, oppure decodificata da hex o Base64 se lo indichi. Né il messaggio né la chiave vengono inviati da nessuna parte. È comunque meglio tenere un segreto di produzione fuori dalle pagine web: quando puoi, usa una chiave di test.

Domande

Perché il mio HMAC è diverso da quello calcolato dal mio server?

Le cause tipiche sono una chiave letta con la codifica sbagliata (una chiave hex o Base64 trattata come testo semplice), un a capo finale o terminazioni di riga diverse nel messaggio, un body deserializzato e poi serializzato di nuovo, oppure un algoritmo di hash diverso. Controlla anche se l'altra parte mostra il risultato in hex o in Base64.

HMAC equivale a calcolare l'hash della chiave seguita dal messaggio?

No. Con SHA-256, SHA-512, SHA-1 o MD5, l'hash di chiave più messaggio si può estendere: chi vede l'hash può aggiungere dati e calcolare un hash valido senza conoscere la chiave. HMAC calcola l'hash due volte con due chiavi derivate, e questo chiude la falla.

Quanto deve essere lunga una chiave HMAC?

Usa una chiave casuale lunga almeno quanto l'output dell'hash: 32 byte per SHA-256, 64 byte per SHA-512. Una chiave più lunga aggiunge poco, e una chiave più lunga della dimensione del blocco dell'hash viene prima ridotta passandola nell'hash. Una chiave corta o facile da indovinare si può trovare provando i candidati su un solo messaggio di cui si conosce il tag.

HMAC-SHA1 e HMAC-MD5 sono compromessi?

Gli attacchi a collisione che hanno compromesso SHA-1 e MD5 come semplici hash non si traducono in una falsificazione pratica dei loro HMAC. Si trovano ancora in protocolli più vecchi, ma per qualsiasi cosa nuova scegli HMAC-SHA256 o un algoritmo più robusto.

Altri strumenti in Hash