3 MESSAGE AUTENTICATION CODE
Uno schema di autenticazione dei messaggi consente a individui in possesso di una chiave segreta condivisa di realizzare l’obiettivo dell’integrità dei dati.
Supponiamo di trovarci di fronte al seguente scenario: S è un messaggio inviato all'entità A e contenente dei dati che lo identificano come proveniente da B. Nell'ambito da noi preso in considerazione B ed A, possono essere: persone reali, gruppi, indirizzi di rete o altro. A deve essere in grado di verificare in maniera sicura la provenienza del messaggio; questo può essere fatto mediante l'uso di un repository pubblico dove vengono abbinati identificativi e identità, il meccanismo appena indicato non rende possibile rinnegare la paternità dei messaggi inviati. Una esigenza stringente è che sia sempre possibile verificare che il messaggio non è stato alterato; per meglio comprendere questo immaginiamo il seguente scenario: B invia alla sua banca una richiesta di pagamento a favore di A per una data cifra firmando la richiesta, se A riesce a modificare il messaggio in modo da aumentare questa cifra, la banca non ha modo di verificare se quella fosse la richiesta originariamente spedita da A e quindi A riesce ad ottenere più di quanto gli spettasse.
|
|
|
L'autenticazione dei dati trasmessi attraverso una rete è più importante rispetto alla privacy dei dati quando questi ultimi interessano operazioni commerciali. Se lo schema proposto non garantisce un'autenticazione affidabile, un eventuale nemico non ha bisogno di effettuare un attacco attivo. Il nemico in questo caso per creare danni può modificare le comunicazioni, oppure introdurne delle nuove. Una situazione del genere è un opportunità in più fornita al nemico ed è perciò preferibile non dargliela.
Il problema dell’autenticazione è molto differente dal problema della cifratura. In questo caso non ci preoccupiamo della segretezza delle informazioni, ma della capacità del nemico di modificarle.
3.2 SCHEMI DI AUTENTICAZIONE DEI MESSAGGI
Quando viene usata una chiave privata per fornire l’integrità dei dati si fa uso di uno schema di autenticazione dei messaggi. Questo è uno schema specificato da tre algoritmi:
un algoritmo di generazione della chiave K;
un algoritmo di creazione di una etichetta T
un algoritmo di verifica V.
Il mittente ed il destinatario sono in possesso di una chiave K generata
attraverso l'algoritmo K e non conosciuta dal nemico. Quando il mittente vuole
inviare un messaggio M in modo autenticato a B, egli calcola una etichetta
per M come una funzione di M
e
della chiave segreta K condivisa tra il mittente ed il destinatario, nel modo
specificato dall’algoritmo di etichettatura T ; vale a dire
. Questa etichetta accompagna il messaggio nella trasmissione; cioè,
S
trasmette la coppia (M,
) a B. (Si noti che il messaggio è inviato in chiaro. Inoltre la lunghezza della
trasmissione è più lunga del messaggio originario della lunghezza
dell’etichetta
). Quando il destinatario B riceve una trasmissione (M’,
) supposta provenire da S, verifica
l'autenticità dell’etichetta usando la procedura di verifica specificata,
che dipende dal messaggio, dall’etichetta, e dalla chiave condivisa. Cioè
egli calcola
, il cui risultato è o il valore vero o il valore falso.
Se questo valore è vero, i dati letti sono ritenuti autentici e così B
li accetta come provenienti da S. Altrimenti
li scarta come dati non autentici.
|
|
|
Definizione Uno schema di autenticazione dei messaggi MA=(K,T,V) consiste di tre algoritmi, come segue:
L’algoritmo
K
di generazione della chiave è di tipo randomizzato e ritorna una chiave K; scriviamo
K
K.
L’algoritmo
di etichettatura T è un algoritmo che prende la chiave K e un messaggio
M e ritorna una
etichetta
; scriviamo
T(M).
L’algoritmo
di verifica V è un algoritmo deterministico che prende la
chiave K, un messaggio M, e una
etichetta candidata
per M e ritorna un valore
booleano vero o falso; scriviamo d
V
).
Associato
allo schema c’è lo spazio di tutti i possibili messaggi MsgSp.
Si richiede che
per ogni K e per tutti gli M appartenenti a
MsgSp.
L’ultima parte della definizione dice che se le etichette sono correttamente generate allora passeranno l’algoritmo di verifica. Questo semplicemente assicura che l’autenticità dei dati sarà accettata dal ricevente.
L’algoritmo di etichettatura può essere randomizzato, vale a dire che una moneta al suo interno è lanciata e usa questi lanci per determinare i suoi output. In questo caso, ci possono essere molte etichette corrette per un singolo messaggio M.
Sia
un cifrario a blocchi. Il CBC-MAC
con funzione di base F è lo schema di autenticazione dei messaggi nel quale
l’etichetta di un messaggio è l’ultimo blocco del testo cifrato ottenuto
cifrando il messaggio in modalità CBC con vettore di inizializzazione zero IV.
Più in dettaglio, lo schema è CBC-MAC
=(K,T,V) dove K è
l’algoritmo che fornisce
una chiave K di k-bit lanciando k monete e ritornando le loro uscite. Il
messaggio M di input agli algoritmi prima devono avere una lunghezza multipla di
l bit.
Algoritmo
Dividi
M in blocchi di l bit, M=
For
i=1,…,n do
Return
|
Algoritmo
Dividi
M in blocchi di l bit, M=
For
i=1,…,n do
If
|
Poiché
l’algoritmo di etichettatura è deterministico, l’algoritmo di verifica
semplicemente controlla se
è o non è l’etichetta corretta come discusso precedentemente.
La scelta dello spazio dei messaggi è importante per la sicurezza del CBC-MAC. Se sono permessi messaggi di varia lunghezza lo schema è insicuro, ma se la lunghezza dei messaggi è ristretta a qualche valore singolo fissato e prespecificato, lo schema diventa più sicuro.
Quando DES è usato come cifrario a blocchi F, i blocchi avranno lunghezza pari a 64 bit, e la chiave del MAC è una chiave DES di 56 bit.
Recentemente c’è stato un grande interesse nel campo della autenticazione dei messaggi con l’uso di funzioni hash come MD5 ed SHA, particolarmente per i protocolli di sicurezza di Internet. Nel software queste funzioni hash sono significativamente più veloci del DES; il codice di libreria è largamente e liberamente disponibile; e non ci sono restrizioni di esportazione sulle funzioni hash. Le funzioni hash non sono state originariamente progettate per il MAC. (Una delle molte difficoltà è che esse non sono esattamente delle primitive con chiave, cioè, non forniscono la nozione di chiave segreta).
Considereremo alcune proposte di costruzioni di MAC basate su funzioni hash.
METODO DEL PREFISSO SEGRETO - Consideriamo un messaggio x=x1x2…xt e una funzione hash iterata secondo il modello generale di funzioni hash, con funzione di compressione f , con definizione : H0=IV, Hi=f(Hi-1,xi); h(x)=Ht. Supponiamo di voler usare h come un algoritmo MAC pre aggiungendo una chiave segreta k, cosi che il MAC proposto di x è M=h(k||x). Ma un nemico estendendo il messaggio x di un blocco di lunghezza arbitraria y, potrebbe ricavare M’=h(k||x||y) come f(M||y) senza conoscere la chiave segreta k ( il MAC originale è usato come variabile di concatenamento). Questo è vero anche per le funzioni hash come MD5 in cui il pre-processo di padding aggiunge il blocco z indicatore della lunghezza del messaggio originario x che apparirebbe come parte del messaggio esteso x||z||y, ma un MAC falsificato alla fine può tuttavia essere dedotto. Per simili ragioni, è insicuro usare una funzione hash per costruire un algoritmo MAC usando la chiave segreta k con IV. Se k comprende l’intero primo blocco, allora per efficienza f(IV,k) può essere precalcolata, dimostrando che un nemico ha bisogno di trovare solamente un k’ (non necessariamente k) tale che f(IV,k)=f(IV,k’) ; questo è equivalente ad usare un segreto IV.
METODO DEL SUFFISSO SEGRETO - Una proposta alternativa è di usare una chiave segreta come un suffisso, cioè il MAC di n-bit è M=h(x||k). Se h segue il modello generale allora la dipendenza da k del MAC è limitata solamente alla componente finale, e la chiave è usata solamente in un solo passo.
METODO DELL’INVILUPPO CON PADDING - Per una chiave k ed una funzione hash h, calcola il MAC su un messaggio x nel modo seguente: h(x)=h(k||p||x||k). Dove p rappresenta una stringa usata per fare il padding di k affinché raggiunga la lunghezza di un blocco, per assicurare che il calcolo interno utilizzi almeno due iterazioni. Per esempio se h è MD5 e k è di 128 bit, allora p è una stringa lunga 384 bit.
Le difficoltà delle costruzioni precedenti nell'analisi della sicurezza, hanno indotto alla progettazione di HMAC che intende riempire questo vuoto. Essa ha prestazioni che sono essenzialmente quelle delle funzioni hash utilizzate. Essa usa la funzione hash in modo black-box così che può essere implementata con il codice disponibile, e anche il rimpiazzamento della funzione hash a causa della sicurezza o delle prestazioni si può effettuare agevolmente. Il suo vantaggio principale, naturalmente, è che può essere provata la sicurezza fornita dalla funzione hash utilizzata che ha qualche ragionevole forza crittografica. Le caratteristiche di sicurezza possono essere riassunte così: se HMAC fallisce ad essere un MAC sicuro, significa che ci sono sufficienti punti deboli nella funzione hash utilizzata che ha bisogno di essere esclusa non solo da questo particolare uso ma da un ampio raggio di altri usi popolari ai quali essa è attualmente soggetta.
Sia H la funzione hash, per semplicità di descrizione assumiamo H essere MD5 o SHA-1. H prende input di qualsiasi lunghezza e produce output ad l bit ( l=128 per MD5 ed l=160 per SHA-1). Sia Text il messaggio al quale la funzione MAC deve essere applicata e sia K la chiave segreta e condivisa dell’autenticazione del messaggio delle due parti. ( La chiave non dovrebbe essere più lunga di 64 byte la dimensione di un blocco hash e se più corta degli zero sono aggiunti per rendere la lunghezza esattamente di 64 byte). Noi fissiamo inoltre due differenti stringhe di 64 byte ipad e opad come segue:
ipad= il byte 0x36 ripetuto 64 volte
opad= il byte 0x5c ripetuto 64volte.
La funzione HMAC prende la chiave K e Text , e produce
Cioè:
(1) Appendi zero alla fine di K per creare una stringa di 64 byte
(2) XOR della stringa di 64 byte calcolata nel passo (1) con ipad
(3) Appendi il messaggio Text alla stringa risultante al passo (2)
(4) Applica H alla stringa generata al passo (3)
(5) XOR della stringa di 64 byte calcolata al passo (1) con opad
(6) Appendi il risultato hash di H dal passo (4) alla stringa di 64 byte risultante dal passo (5)
(7) Applica H alla stringa generata nel passo (6) ed restituisci il risultato in output.
La lunghezza raccomandata della chiave è almeno di l bit. Una chiave più lunga non aggiunge nulla di significativo alla sicurezza della funzione.
HMAC opzionalmente consente il troncamento dell’output finale diciamo a 80 bit.
Il costo totale per l’autenticazione di un messaggio Text è prossimo a quello del calcolo della funzione hash del messaggio, specialmente se Text è grande. Inoltre, l'hashing delle chiavi aggiunte può essere precancolato per un miglioramento dell’efficienza.
Nota che HMAC usa la funzione hash H come un black box e nessuna modifica al codice per H è richiesta per implementare HMAC. Questo rende facile usare librerie di codice per H e anche rimpiazzare una particolare funzione hash, tale come MD5, con un’altra come SHA. HMAC è stato recentemente scelto come obbligatorio per implementare l’autenticazione per i protocolli di sicurezza Internet che sono stati progettati per IPSEC dal gruppo di lavoro dell’IETF. Per questo scopo HMAC è descritto in una RFC. Altri protocolli Internet stanno adottando HMAC come per esempio s-http, SSL.
Come
abbiamo già menzionato le funzioni hash non sono originariamente progettate per
essere usate per l’autenticazione dei messaggi. In particolare esse non sono
delle primitive con chiavi, e non è chiaro quale sia la chiave migliore per
loro. In questo modo è necessario essere attenti particolarmente
nell’adottare una funzione hash per il MAC. La
massima che guida la costruzione di HMAC
è stata che l’assenza di attacchi oggi non implica la sicurezza per
il futuro. Le
assunzioni sulla sicurezza delle funzioni hash non dovrebbero essere troppo
forti, poiché non è stata ancora raggiunta un sufficiente collaudo con le
candidate (come MD5 ed SHA). Ciò che si è mostrato è che se la funzione hash ha proprietà
di sicurezza allora il MAC è sicuro: l’unico modo in cui il MAC potrebbe fallire
è se la funzione hash fallisce. La sicurezza del MAC significa sicurezza contro
le contraffazioni. Il MAC è considerato rotto se un nemico non avendo la chiave
K può trovare qualche messaggio Text
insieme con il suo corretto valore MAC
. Il nemico si assume possa avere a disposizione un certo numero di coppie di
messaggi e del loro corretto valore MAC osservando il traffico tra il mittente
ed il destinatario. Inoltre al nemico è consentito di poter influenzare la
scelta dei messaggi di cui conosce il corretto valore MAC. La sicurezza è
classificata in termini della probabilità di una contraffazione con successo
sotto tali attacchi.
Gli
attacchi del compleanno che stanno alla base della ricerca delle collisioni per le
funzioni hash possono essere applicati anche agli schemi MAC basati su funzioni iterate
(incluso anche CBC-MAC, ed altri schemi). In
particolare essi costituiscono il miglior modo conosciuto di attacco per la contraffazione
contro HMAC. Tuttavia, la loro rilevanza pratica
contro queste funzioni è trascurabile data la lunghezza tipica dei valori hash
come 128 o 160 bit.
Inoltre
questi attacchi richiedono la collezione del valore MAC (per una data chiave)
di circa
messaggi (dove l è la lunghezza
del valore hash). Per valori di l >128 l’attacco diviene totalmente impraticabile. Per esempio, quando si usa MD5 un tale attacco dovrebbe richiedere
l’autenticazione di
blocchi di dati usando la stessa chiave. Su di un link di comunicazione a
1Gbit/sec, ci vorrebbero 250.000 anni per computare tutti i dati richiesti da un
simile attacco.
|
|