L’HMAC (Hash-based Message Authentication Code) è un costrutto crittografico standardizzato (RFC 2104) che combina una funzione hash crittografica con una chiave segreta condivisa per produrre un codice di autenticazione del messaggio (MAC):
dove e sono costanti di padding (0x36 e 0x5C ripetuti per riempire un blocco). La costruzione a doppio hash — inner hash e outer hash con chiavi derivate distinte — è progettata per essere sicura anche se la funzione hash sottostante ha debolezze strutturali come la vulnerabilità length extension di Merkle-Damgård.
Cosa garantisce
HMAC garantisce due proprietà simultaneamente:
Integrità: qualsiasi modifica al messaggio produce un MAC completamente diverso. Il destinatario che ricalcola HMAC sul messaggio ricevuto e lo confronta con il MAC allegato può verificare che il messaggio non sia stato alterato in transito.
Autenticità: solo chi possiede la chiave segreta può produrre un MAC valido. Il destinatario che verifica il MAC è certo che il mittente conosce — ovvero è l’entità con cui la chiave è stata condivisa.
HMAC non garantisce confidenzialità: il messaggio non è cifrato, è solo autenticato. Per confidenzialità + integrità si usano algoritmi AEAD come AES-GCM.
Perché non SHA256 (chiave || messaggio)
Il costrutto naïve H(K || m) è vulnerabile all’attacco length extension in SHA-2: conoscendo H(K || m) e la lunghezza di K || m, un attaccante può calcolare H(K || m || padding || m') senza conoscere , producendo un MAC valido per un messaggio falsificato. La costruzione HMAC con doppio hash è provabilmente immune a questo attacco.
Usi principali
HMAC-SHA256 e HMAC-SHA512 sono onnipresenti nell’ecosistema crittografico. In TLS vengono usati nella derivazione delle chiavi (PRF) e come base di HKDF. Nei JWT (JSON Web Token) con algoritmo HS256, il token è firmato con HMAC-SHA256: il server verifica la firma per autenticare il token senza database lookup. Nelle API REST (AWS Signature Version 4, GitHub webhook signatures) ogni richiesta è firmata con HMAC per prevenire la manomissione e autenticare il chiamante. In SSH per l’integrità dei pacchetti del protocollo binario.
Scelta della funzione hash
HMAC è parametrico rispetto alla funzione hash: HMAC-MD5, HMAC-SHA1, HMAC-SHA256, HMAC-SHA512, HMAC-SHA3-256 sono tutti validi. Anche se MD5 e SHA-1 come hash standalone sono rotti per collision resistance, HMAC-MD5 e HMAC-SHA1 rimangono sicuri per l’autenticazione dei messaggi (la sicurezza di HMAC dipende dalla pre-image resistance, non dalla collision resistance) — ma per nuovi sistemi si raccomanda HMAC-SHA256 o superiore.