Indice dei contenuti
- Che cos’è un HMAC
- Come funziona un HMAC
- Perché usare una funzione di hash
- Differenze tra HMAC e MAC tradizionali
- Cosa sono le funzioni di GAS (Generalized Authentication Services)
- Dove viene usato l’HMAC
- Vantaggi dell’HMAC
- Svantaggi e limiti
- Confronto tra HMAC e altri metodi di autenticazione
Autenticare messaggi e garantire l’integrità dei dati sono attività importantissime. Uno degli strumenti più affidabili per farlo è l’HMAC, acronimo di Hash-based Message Authentication Code.
Questo meccanismo consente a due parti di verificare che un messaggio non sia stato alterato e che provenga realmente da una fonte autorizzata, utilizzando algoritmi di hash combinati con una chiave segreta condivisa.
In questo articolo approfondiremo che cos’è l’HMAC, come funziona tecnicamente, quali sono le funzioni di hash crittografiche coinvolte, quali vantaggi offre rispetto ad altri metodi di autenticazione e perché è così diffuso nelle API, nelle VPN e nei protocolli HTTPS.
Che cos’è un HMAC
Definizione dettagliata
L’HMAC, acronimo di Hash-based Message Authentication Code, è un tipo di MAC (Message Authentication Code), cioè un codice di autenticazione del messaggio, basato su una funzione di hash crittografica e una chiave segreta condivisa. Serve a garantire integrità e autenticità dei messaggi scambiati tra due parti.
In pratica, un HMAC è un valore univoco calcolato su un messaggio combinandolo con una chiave segreta. Se il messaggio cambia anche solo di un byte, o se la chiave non è la stessa, l’HMAC risultante sarà completamente diverso.
Funzionamento tecnico dell’HMAC
Un HMAC sfrutta una funzione hash sicura (come SHA-256, SHA-3 o BLAKE2), ma invece di applicarla direttamente al messaggio, viene applicata due volte, prima all’interno e poi all’esterno, utilizzando la chiave segreta mescolata con padding specifici.
Formula ufficiale:
HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
Dove:
- K è la chiave segreta condivisa
- m è il messaggio
- K’ è la chiave normalizzata alla dimensione del blocco della funzione hash
- ⊕ è l’operazione XOR
- opad e ipad sono costanti di padding (outer e inner pad)
- || indica la concatenazione
- H è la funzione di hash (ad esempio SHA-256)
Esempio pratico in Python
Ecco un esempio di come calcolare un HMAC in Python:
import hmac
import hashlib
# Chiave segreta
key = b'segreta123'
# Messaggio da autenticare
message = b'Autenticazione del messaggio con HMAC'
# Calcolo HMAC con SHA-256
mac = hmac.new(key, message, hashlib.sha256)
# Output in esadecimale
print("HMAC:", mac.hexdigest())
Output possibile:
HMAC: e9ef3f60e7767d5a53983bfb7d22ea1f90a3e2f7aa81ee1f28527d3430d9beaf
Questo valore cambia completamente se:
- Modifichiamo anche un solo carattere nel messaggio
- Usiamo una chiave diversa
- Cambiamo l’algoritmo hash (es. SHA-1, SHA-512…)
Esempio di verifica HMAC
Per controllare se un messaggio è autentico:
# Ricevo il messaggio e l’HMAC
received_message = b'Autenticazione del messaggio con HMAC'
received_hmac = b'e9ef3f60e7767d5a53983bfb7d22ea1f90a3e2f7aa81ee1f28527d3430d9beaf'
# Ricalcolo l’HMAC con la mia chiave
mac_check = hmac.new(key, received_message, hashlib.sha256)
# Verifico che corrisponda
if hmac.compare_digest(mac_check.hexdigest(), received_hmac.decode()):
print("Messaggio autentico e integro.")
else:
print("Attenzione: il messaggio potrebbe essere stato alterato.")
Perché l’HMAC è importante
L’HMAC è importante perché:
- Protegge i dati durante il transito
- Garantisce l’autenticità della fonte
- Previene le modifiche non autorizzate ai messaggi
Viene usato in:
- Comunicazioni HTTPS
- Token JWT
- Sistemi di autenticazione API
- VPN
- Aggiornamenti software (firmware)
Come funziona un HMAC
Struttura logica del funzionamento
Il funzionamento di un HMAC (Hash-based Message Authentication Code) si basa sull’utilizzo di una funzione di hash crittografica (come SHA-256) combinata con una chiave segreta e un messaggio da proteggere. L’obiettivo è ottenere un codice di autenticazione che dimostri che:
- Il messaggio non è stato modificato
- Il messaggio proviene da chi possiede la chiave segreta
Il meccanismo include due passaggi fondamentali di hashing:
- Un hash interno del messaggio mescolato con la chiave segreta e un padding detto ipad
- Un hash esterno del risultato precedente mescolato ancora con la chiave e un padding detto opad
Fasi del processo HMAC
1. Normalizzazione della chiave
La chiave K viene adattata:
- Se troppo lunga, viene hashata
- Se troppo corta, viene riempita di zeri fino a raggiungere la dimensione del blocco della funzione di hash (es. 64 byte per SHA-256)
block_size = 64 # per SHA-256
if len(key) > block_size:
key = hashlib.sha256(key).digest()
elif len(key) < block_size:
key = key + b'\x00' * (block_size - len(key))
2. Calcolo del padding
Si calcolano:
- ipad: 0x36 ripetuto per la lunghezza del blocco
- opad: 0x5c ripetuto per la lunghezza del blocco
3. Operazioni XOR
Si calcolano:
- K_ipad = K ⊕ ipad
- K_opad = K ⊕ opad
4. Hashing interno ed esterno
- Primo hash (interno): H(K_ipad || message)
- Secondo hash (esterno): H(K_opad || primo_hash)
Codice completo simulato in Python (senza libreria hmac)
import hashlib
def hmac_sha256(key, message):
block_size = 64 # SHA-256 block size in bytes
if len(key) > block_size:
key = hashlib.sha256(key).digest()
if len(key) < block_size:
key += b'\x00' * (block_size - len(key))
o_key_pad = bytes([b ^ 0x5c for b in key])
i_key_pad = bytes([b ^ 0x36 for b in key])
inner_hash = hashlib.sha256(i_key_pad + message).digest()
hmac_result = hashlib.sha256(o_key_pad + inner_hash).hexdigest()
return hmac_result
# Esempio di utilizzo
key = b'segreta123'
msg = b'Autenticazione con HMAC'
print("HMAC:", hmac_sha256(key, msg))
Perché questo doppio hash?
Il doppio hashing serve a:
- Separare chiaramente il messaggio dalla chiave
- Evitare attacchi di estensione di lunghezza che colpiscono alcune funzioni hash come SHA-1
- Rendere l’HMAC sicuro anche se la funzione hash presenta debolezze minori
Visualizzazione a blocchi
K ---⊕--- ipad ----->| |
| Hash (interno) |----⊕--- opad --> Hash (esterno) --> HMAC
message ------------>| |
Questa rappresentazione dimostra come la chiave venga applicata due volte, ma sempre attraverso XOR con costanti e seguita da hashing.
Funzionamento dal lato ricevente
Il destinatario:
- Riceve il messaggio + HMAC
- Usa la stessa chiave segreta
- Ricalcola l’HMAC
- Confronta il risultato con quello ricevuto (meglio se usando hmac.compare_digest() per evitare timing attack)
Riepilogo: proprietà garantite
- Integrità
Nessuna modifica senza che l’HMAC cambi - Autenticità
Solo chi possiede la chiave può generare un HMAC valido - Efficienza
Eseguibile anche su dispositivi embedded e a basso consumo
Perché usare una funzione di hash
Le funzioni di hash come SHA-256, SHA-3, BLAKE2, e altre, sono fondamentali per l’HMAC perché garantiscono:
- Determinismo
Lo stesso input produce sempre lo stesso output - Diffusione
Anche un piccolo cambiamento nell’input cambia completamente l’output - Efficienza
L’hash viene calcolato rapidamente - Resistenza alle collisioni
Difficile trovare due input diversi che producono lo stesso hash
Queste caratteristiche rendono le funzioni hash ideali per garantire integrità dei dati. Nell’HMAC, vengono ulteriormente rafforzate dalla presenza della chiave segreta, rendendo l’hash non solo una prova di integrità, ma anche di autenticità.
Differenze tra HMAC e MAC tradizionali
Cosa sono i MAC
Un MAC (Message Authentication Code) è un valore calcolato da una funzione crittografica che permette di verificare l’autenticità e l’integrità di un messaggio. I MAC sono tipicamente simmetrici, il che significa che sia il mittente che il destinatario devono condividere la stessa chiave segreta.
Esistono diversi tipi di MAC, tra cui:
- CBC-MAC
Basato su un cifrario a blocchi (come AES) - CMAC
Una variante più sicura del CBC-MAC - HMAC
Basato su una funzione di hash
Confronto tecnico tra HMAC e MAC tradizionali
Caratteristica | HMAC | MAC tradizionali (es. CBC-MAC) |
Algoritmo base | Funzione di hash (es. SHA-256) | Cifrario a blocchi (es. AES) |
Tipo di chiave | Simmetrica | Simmetrica |
Efficienza | Alta, anche su hardware generico | Alta su hardware ottimizzato per cifratura |
Sicurezza | Molto elevata, anche su input variabili | Sicurezza elevata solo su input fissi |
Vulnerabilità note | Pochissime, ben studiate | CBC-MAC vulnerabile su messaggi di lunghezza variabile |
Facilità d’uso | Alta, usabile con qualsiasi hash | Più complesso da implementare correttamente |
Standard di riferimento | RFC 2104 | NIST SP 800-38B per CMAC |
Portabilità | Alta | Dipende dalla disponibilità del cifrario |
Uso tipico | API REST, JWT, TLS, IoT | Firmware autenticati, protocolli embedded |
Esempio pratico: HMAC vs CBC-MAC in codice Python
Esempio di HMAC:
import hmac
import hashlib
key = b'segreta123'
msg = b'Messaggio importante'
mac = hmac.new(key, msg, hashlib.sha256)
print("HMAC:", mac.hexdigest())
Simulazione (semplificata) di CBC-MAC con AES:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
key = b'chiave16byte1234' # AES a 128 bit
msg = b'Messaggio importante'
cipher = AES.new(key, AES.MODE_CBC, iv=b'\x00'*16)
# Pad del messaggio
mac_result = cipher.encrypt(pad(msg, 16))[-16:] # Ultimo blocco
print("CBC-MAC:", mac_result.hex())
Nota: CBC-MAC non deve essere usato con messaggi di lunghezza variabile senza ulteriori precauzioni, altrimenti è vulnerabile ad attacchi.
Sicurezza su input variabili
Uno dei punti deboli di CBC-MAC è che non è sicuro se il messaggio ha lunghezza variabile, a meno che non venga integrato con una lunghezza codificata o usato all’interno di CMAC.
Al contrario, HMAC è sicuro anche su input di qualsiasi lunghezza, rendendolo molto più flessibile.
Integrazione nei protocolli
- HMAC è utilizzato in: TLS/SSL, IPsec, OAuth, JWT, Amazon S3 API, Google Cloud, VPN.
- CBC-MAC / CMAC è usato in: autenticazione firmware, smart card, NFC, sistemi embedded con supporto AES.
Quando scegliere l’uno o l’altro
Scenario | Soluzione consigliata |
Applicazioni generiche su web, cloud, API | HMAC |
Sistemi embedded con accelerazione hardware AES | CMAC (o CBC-MAC sicuro) |
Messaggi di lunghezza variabile | HMAC |
Compatibilità con dispositivi legacy | CBC-MAC (con attenzione) |
Alta portabilità tra ambienti diversi | HMAC |

Cosa sono le funzioni di GAS (Generalized Authentication Services)
Le funzioni GAS non sono una singola implementazione ma una classe di servizi che sfruttano meccanismi come HMAC, firma digitale o certificati per autenticare entità in un sistema distribuito.
Ad esempio, nei sistemi di sicurezza distribuiti come Kerberos o nei framework zero-trust, le funzioni di autenticazione generalizzata includono:
- Verifica dell’identità
- Scambio sicuro delle chiavi
- Generazione e validazione di token HMAC
L’HMAC, in questo contesto, viene usato come uno strumento efficace all’interno di queste funzioni per proteggere le comunicazioni, generare token di accesso firmati e validare le richieste su sistemi come OAuth o OpenID.
Dove viene usato l’HMAC
L’HMAC è usato in una vasta gamma di applicazioni reali, tra cui:
- API REST
Per autenticare richieste tra client e server - JWT (JSON Web Token)
Come metodo di firma dei token - TLS/SSL
Per garantire integrità dei pacchetti - VPN IPsec e SSL
Per verificare l’autenticità dei pacchetti - Firmware e aggiornamenti OTA
Per verificare che il codice ricevuto non sia stato manomesso - Sistemi embedded IoT
Per autenticazione tra dispositivi a bassa potenza
Vantaggi dell’HMAC
I principali vantaggi dell’HMAC sono:
- Alta sicurezza
Combina le proprietà delle funzioni hash con la segretezza della chiave - Prestazioni elevate
Calcolo veloce e compatibilità con hardware - Flessibilità
Supporta qualsiasi funzione hash crittograficamente sicura - Standardizzazione
Definito da RFC 2104 ed è ampiamente supportato
Svantaggi e limiti
Tuttavia, l’HMAC ha anche dei limiti:
- Se la chiave segreta è compromessa, tutta la sicurezza cade
- È simmetrico, quindi richiede che entrambe le parti condividano la stessa chiave in modo sicuro
- Non offre non-repudiation: non può essere usato per la firma digitale in senso legale
Confronto tra HMAC e altri metodi di autenticazione
Metodo | Tipo di Chiave | Vantaggi | Svantaggi |
HMAC | Simmetrica | Veloce, semplice, sicuro | Richiede scambio sicuro della chiave |
Firma RSA/ECC | Asimmetrica | Non-repudiation | Più lento, più complesso |
CBC-MAC | Simmetrica | Efficiente per messaggi fissi | Meno sicuro per messaggi variabili |
JWT-HMAC | Simmetrica | Leggero e flessibile | Non valido per uso legale |
Domande e risposte
- Cos’è l’HMAC?
È un codice di autenticazione del messaggio basato su una funzione hash e una chiave segreta. - A cosa serve l’HMAC?
Serve a garantire integrità e autenticità dei messaggi in ambienti digitali. - Quali funzioni hash si usano con HMAC?
SHA-256, SHA-1, SHA-3, BLAKE2, tra le più comuni. - L’HMAC è sicuro?
Sì, se viene usato con una buona funzione hash e una chiave segreta sufficientemente lunga. - HMAC è uguale a una firma digitale?
No, non fornisce non-repudiation e richiede una chiave simmetrica condivisa. - Dove si usa l’HMAC?
In TLS, VPN, API REST, JWT, firmware IoT, e molto altro. - Che differenza c’è tra hash e HMAC?
Un hash è pubblico e unilaterale, l’HMAC include una chiave segreta per l’autenticazione. - Cos’è una funzione di GAS?
Un meccanismo per autenticare e autorizzare entità in un sistema distribuito. - L’HMAC può essere decifrato?
No, ma può essere ricalcolato da chi possiede la chiave segreta. - Esistono alternative all’HMAC?
Sì, come CBC-MAC, CMAC, firme RSA o ECDSA, a seconda del contesto.