Loading...

Approfondimento Tech

Hash-based Message Authentication Code (HMAC): autenticazione sicura con hash

Scopri cos'è l'HMAC, come funziona, le sue applicazioni nella cyber security e il ruolo delle funzioni di hash per l'autenticazione.

Hash-based Message Authentication Code.

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:

  1. Un hash interno del messaggio mescolato con la chiave segreta e un padding detto ipad
  2. 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:

  1. Riceve il messaggio + HMAC
  2. Usa la stessa chiave segreta
  3. Ricalcola l’HMAC
  4. 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

CaratteristicaHMACMAC tradizionali (es. CBC-MAC)
Algoritmo baseFunzione di hash (es. SHA-256)Cifrario a blocchi (es. AES)
Tipo di chiaveSimmetricaSimmetrica
EfficienzaAlta, anche su hardware genericoAlta su hardware ottimizzato per cifratura
SicurezzaMolto elevata, anche su input variabiliSicurezza elevata solo su input fissi
Vulnerabilità notePochissime, ben studiateCBC-MAC vulnerabile su messaggi di lunghezza variabile
Facilità d’usoAlta, usabile con qualsiasi hashPiù complesso da implementare correttamente
Standard di riferimentoRFC 2104NIST SP 800-38B per CMAC
PortabilitàAltaDipende dalla disponibilità del cifrario
Uso tipicoAPI REST, JWT, TLS, IoTFirmware 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

ScenarioSoluzione consigliata
Applicazioni generiche su web, cloud, APIHMAC
Sistemi embedded con accelerazione hardware AESCMAC (o CBC-MAC sicuro)
Messaggi di lunghezza variabileHMAC
Compatibilità con dispositivi legacyCBC-MAC (con attenzione)
Alta portabilità tra ambienti diversiHMAC
Generalized Authentication Services

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

MetodoTipo di ChiaveVantaggiSvantaggi
HMACSimmetricaVeloce, semplice, sicuroRichiede scambio sicuro della chiave
Firma RSA/ECCAsimmetricaNon-repudiationPiù lento, più complesso
CBC-MACSimmetricaEfficiente per messaggi fissiMeno sicuro per messaggi variabili
JWT-HMACSimmetricaLeggero e flessibileNon valido per uso legale

Domande e risposte

  1. Cos’è l’HMAC?
    È un codice di autenticazione del messaggio basato su una funzione hash e una chiave segreta.
  2. A cosa serve l’HMAC?
    Serve a garantire integrità e autenticità dei messaggi in ambienti digitali.
  3. Quali funzioni hash si usano con HMAC?
    SHA-256, SHA-1, SHA-3, BLAKE2, tra le più comuni.
  4. L’HMAC è sicuro?
    Sì, se viene usato con una buona funzione hash e una chiave segreta sufficientemente lunga.
  5. HMAC è uguale a una firma digitale?
    No, non fornisce non-repudiation e richiede una chiave simmetrica condivisa.
  6. Dove si usa l’HMAC?
    In TLS, VPN, API REST, JWT, firmware IoT, e molto altro.
  7. Che differenza c’è tra hash e HMAC?
    Un hash è pubblico e unilaterale, l’HMAC include una chiave segreta per l’autenticazione.
  8. Cos’è una funzione di GAS?
    Un meccanismo per autenticare e autorizzare entità in un sistema distribuito.
  9. L’HMAC può essere decifrato?
    No, ma può essere ricalcolato da chi possiede la chiave segreta.
  10. Esistono alternative all’HMAC?
    Sì, come CBC-MAC, CMAC, firme RSA o ECDSA, a seconda del contesto.
To top