HMAC

Indice dei contenuti

    L’HMAC (Hash-based Message Authentication Code) è un costrutto crittografico standardizzato (RFC 2104) che combina una funzione hash crittografica con una chiave segreta condivisa KK per produrre un codice di autenticazione del messaggio (MAC):

    HMACK(m)=H((Kopad)H((Kipad)m))\text{HMAC}_K(m) = H\bigl((K \oplus \text{opad}) \| H\bigl((K \oplus \text{ipad}) \| m\bigr)\bigr)

    dove ipad\text{ipad} e opad\text{opad} 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 mm 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 KK può produrre un MAC valido. Il destinatario che verifica il MAC è certo che il mittente conosce KK — 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 KK, 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.

    Ultimo aggiornamento: