close
Vai al contenuto

HMAC

Da Wikipedia, l'enciclopedia libera.

HMAC (keyed-hash message authentication code o hash-based message authentication code) è una modalità per l'autenticazione di messaggi (message authentication code) basata su una funzione di hash, utilizzata in diverse applicazioni legate alla sicurezza informatica.

Tramite HMAC è infatti possibile garantire sia l'integrità, sia l'autenticità di un messaggio. HMAC non si occupa di crittografare il messaggio: il messaggio (crittografato o meno) deve essere trasmesso insieme al codice HMAC. I destinatari che hanno una copia della chiave segreta potranno applicare l'algoritmo al messaggio ricevuto, e se il messaggio è autentico, potranno verificare che il codice ricevuto e quello calcolato da se stessi è identico. HMAC utilizza infatti una combinazione del messaggio originale e una chiave segreta per la generazione del codice.

Una caratteristica peculiare di HMAC è il non essere legato a nessuna funzione di hash in particolare, questo per rendere possibile una sostituzione della funzione nel caso non fosse abbastanza sicura. Le funzioni MD5 e SHA-1, benché siano considerate obsolete per le firme, sono ancora le più utilizzate per HMAC.

Funzionamento

[modifica | modifica wikitesto]

Il messaggio viene suddiviso in blocchi di lunghezza pari a j bit. Viene poi selezionata una chiave segreta K. Nel caso in cui K abbia una lunghezza maggiore di j bit, le viene applicata la funzione H. Quello che si ottiene è detta K', la chiave di HMAC.

K' = K, se |K| = j bit
K' = K + padding di zeri, se |K| < j bit
K′ = H(K) + padding di zeri fino a raggiungere j bit, se ∣K∣ > j bit.
ipad = 00110110 ripetuta j/8 volte
opad = 01011100 ripetuta j/8 volte

Una volta definita K' l'eventuale padding della chiave originale la funzione HMAC calcolerà il valore nel seguente modo:

dove indica una semplice concatenazione posizionale.

Analisi dell'algoritmo HMAC

[modifica | modifica wikitesto]

L'algoritmo HMAC utilizza una funzione di hash iterativa (ad esempio, SHA-256), per elaborare blocchi di dati con lunghezza predefinita. Il processo si suddivide in due fasi principali, denominate inner hash e outer hash.

  • Inner Hash (hash interno o primo hash)
Si calcola l'hash del messaggio combinato con una versione modificata della chiave (). La formula è:
Il risultato di questa operazione è un digest di lunghezza , ad esempio 256 bit nel caso dell'algoritmo SHA-256.
  • Outer Hash (hash esterno o secondo hash)
Per il calcolo del secondo hash, l'algoritmo necessita di una nuova combinazione che inizia con un'altra versione modificata della chiave:
Questa chiave deve avere una lunghezza pari a , ovvero alla dimensione del blocco utilizzato dall'algoritmo di hash (solitamente 512 o 1024 bit). Il digest ottenuto dal primo passaggio viene quindi concatenato a questa chiave modificata per formare un nuovo blocco di dati. Tuttavia, affinché il digest possa essere elaborato correttamente nella seconda fase, è necessario che venga trattato adeguatamente. Ciò significa che nell'equazione finale dell'HMAC, il digest generato dalla prima fase (di lunghezza bit) viene concatenato alla chiave esterna. Dato che le funzioni di hash operano su blocchi di dati aventi dimensioni predefinite, il digest del primo hash viene visto come parte di un flusso di dati in ingresso per la funzione di hash esterna (secondo hash).

Ruolo dei pad (ipad e opad) nell'algoritmo HMAC

[modifica | modifica wikitesto]

Nell'algoritmo HMAC, i valori ipad (inner padding) e opad (outer padding) svolgono un ruolo cruciale per la sicurezza. La loro funzione principale è quella di modificare lo stato di metà dei bit della chiave segreta condivisa, introducendo una struttura a doppio livello che potenzia la robustezza dell'algoritmo. I motivi principali per cui vengono utilizzati includono:

  • Derivazione di due chiavi di lavoro.
I pad consentono di creare due chiavi distinte (una per l'elaborazione interna e l'altra per quella esterna) partendo da una singola chiave segreta condivisa. Questo approccio aumenta la complessità dell'algoritmo, favorendo l'integrità del processo di hashing.
  • Differenziazione statistica.
Le costanti utilizzate per definire ipad (cioè, 0x36 corrispondente a 00110110 in binario) e opad (cioè, 0x5C corrispondente a 01011100 in binario) sono scelte strategicamente per avere una grande distanza di Hamming (ovvero un numero significativo di bit diversi). Questa differenziazione assicura che le due chiavi siano statisticamente indipendenti, migliorando la sicurezza complessiva della funzione hash.
  • Protezione contro gli attacchi di estensione della lunghezza.
La struttura a doppio livello introdotta da ipad e opad è progettata per prevenire gli attacchi noti come length-extension attacks, ai quali molte funzioni hash convenzionali possono essere vulnerabili. Tale protezione garantisce che il messaggio originale non possa essere manipolato o esteso senza alterare il valore dell'HMAC.
  • William Stallings, Cryptography and Network Security: Principles and Practice, 7ª ed., Pearson, 2016, ISBN 978-0134444284.

Altri progetti

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]