Skip to main content
CheckTown
Dev Tools

HMAC: come funziona l'autenticazione basata su hash

Pubblicato 6 min di lettura
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.

Strumenti correlati