In questo articolo
Cos'e l'HMAC?
HMAC (Hash-based Message Authentication Code) e un meccanismo crittografico che combina una chiave segreta con una funzione hash per produrre un codice di autenticazione del messaggio. A differenza di un semplice hash, HMAC dimostra sia l'integrita che l'autenticita di un messaggio.
HMAC e definito in RFC 2104 e viene utilizzato in TLS, IPsec, firme JWT e verifica webhook API. L'algoritmo e resistente agli attacchi di estensione della lunghezza che colpiscono le funzioni hash semplici.
Come funziona HMAC
HMAC utilizza un approccio hash a due passaggi con padding interno ed esterno. La chiave segreta viene completata alla dimensione del blocco della funzione hash e combinata con due costanti diverse.
- Hash interno — la chiave viene combinata con ipad (0x36), concatenata con il messaggio e hashata: H(K XOR ipad || messaggio)
- Hash esterno — la chiave viene combinata con opad (0x5C), concatenata con il risultato dell'hash interno: H(K XOR opad || inner_hash)
- Risultato finale — il risultato dell'hash esterno e il valore HMAC, rappresentato come stringa esadecimale
Questa costruzione a doppio hash previene gli attacchi di estensione della lunghezza. Anche se un attaccante conosce H(messaggio), non puo calcolare HMAC(chiave, messaggio || dati_extra) senza la chiave segreta.
Algoritmi HMAC
La costruzione HMAC funziona con qualsiasi funzione hash crittografica. Le scelte piu comuni sono SHA-256, SHA-384 e SHA-512.
- HMAC-SHA256 — output 256 bit, la variante piu usata per l'autenticazione API, le firme JWT HS256 e la verifica webhook. Dimensione chiave consigliata: 32 byte
- HMAC-SHA384 — output 384 bit, usato nelle suite di cifratura TLS 1.3 e applicazioni ad alta sicurezza. Dimensione chiave consigliata: 48 byte
- HMAC-SHA512 — output 512 bit, preferito quando serve il massimo margine di sicurezza. Dimensione chiave consigliata: 64 byte
La chiave deve essere almeno lunga quanto l'output dell'hash. Per la maggior parte delle applicazioni, HMAC-SHA256 con una chiave casuale di 32 byte offre un'eccellente sicurezza.
Prova gratuitamente — nessuna registrazione richiesta
Genera firme HMAC →Casi d'uso comuni
HMAC e la base di molti protocolli di sicurezza e schemi di autenticazione API.
- Autenticazione API — servizi come Stripe, GitHub e AWS usano firme HMAC per verificare i payload dei webhook
- Firma JWT — gli algoritmi HS256, HS384 e HS512 usano HMAC per firmare il payload del token
- Integrita dei messaggi — HMAC verifica che i dati non siano stati alterati durante la trasmissione
- OAuth 1.0a — il metodo di firma HMAC-SHA1 firma i parametri della richiesta OAuth per dimostrare l'autorizzazione
HMAC vs altri metodi di autenticazione
HMAC e uno dei diversi approcci all'autenticazione dei messaggi. Ognuno ha diversi compromessi in termini di sicurezza, prestazioni e gestione delle chiavi.
- HMAC vs firme digitali — HMAC usa una chiave segreta condivisa (simmetrica), le firme digitali usano coppie di chiavi (asimmetrica). HMAC e piu veloce ma richiede la condivisione del segreto.
- HMAC vs chiavi API — le chiavi API sono semplici token bearer. HMAC firma il contenuto della richiesta, impedendo la falsificazione di nuove richieste.
- HMAC vs hash semplice — l'hashing dimostra l'integrita ma non l'autenticita. HMAC richiede la chiave segreta.
Domande frequenti
Qual e la lunghezza ideale della chiave HMAC?
La chiave deve essere almeno lunga quanto l'output dell'hash — 32 byte per HMAC-SHA256, 48 per HMAC-SHA384, 64 per HMAC-SHA512. Chiavi piu corte indeboliscono la sicurezza.
HMAC e uguale alla crittografia?
No. HMAC fornisce autenticazione e integrita, non riservatezza. Il messaggio rimane leggibile. Usa la crittografia (AES, ChaCha20) oltre a HMAC per nascondere il contenuto.
Posso usare HMAC nel browser con la Web Crypto API?
Si. La Web Crypto API supporta HMAC nativamente tramite crypto.subtle.importKey() e crypto.subtle.sign(). Puoi generare firme HMAC interamente lato client.