Negli ultimi anni la comunicazione digitale su rete ha avuto uno sviluppo notevole. I motivi di tale sviluppo sono vari, ad esempio: commercio elettronico, scambio di dati e messaggi, etc... Tale sviluppo ha fatto si che la richiesta di una maggiore sicurezza su reti diventasse sempre più opprimente. Tra i vari obiettivi da raggiungere per assicurare ciò vi sono la creazione di strumenti per garantire:
Garantire l'integrita' dei dati significa garantire in modo sicuro che i dati trasmessi non siano stati modificati, distrutti o alterati. Invece garantire l'autenticazione dei messaggi significa garantire in modo sicuro e non ambiguo la provenienza dei messaggi.
ESEMPIO
Supponiamo che due utenti Annarella e Biagio debbano comunicare tra loro. Annarella deve mandare il messaggio "Ci vediamo stasera alle 19:00 al solito posto" a Biagio. Se non è garantita l'integrità dei dati un intruso può modificare il messaggio originale di Annarella facendo ricevere a Biagio il seguente messaggio "Ci vediamo stasera alle 20:00 al solito posto" creando cosi' dei seri problemi a Biagio. Se non è garantita l'autenticità dei messaggi un intruso può spedire ad esempio tale messaggio a Biagio "Non ti voglio piu' vedere" facendogli credere che il messaggio è stato spedito da Annarella. Quindi uno schema che ci garantisca queste due proprietà è piu' che necessario.
Una tecnica che garantisce l'integrità dei dati
e l'autenticazione dei
messaggi è il Message Authentication Code (MAC).
Il MAC è una tecnica che garantisce l'integrità dei dati e l'autenticazione dei messaggi, utilizza una chiave privata K nota ad entrambi gli utenti che devono comunicare. Esso prende in input la chiave privata K ed il messaggio e restituisce in output il valore MAC con chiave K del messaggio, che può essere considerato come l'impronta del messaggio.
ESEMPIO: Consideriamo la comunicazione tra 2 utenti Annarella e Biagio, e supponiamo che Annarella debba inviare un messaggio a Biagio, utilizzando il MAC con chiave privata K, nota ad entrambi. Annarella invia a Biagio la coppia di valori (messaggio, impronta del messaggio). Biagio una volta ricevuta la coppia (messaggio, impronta del messaggio) verifica l'autenticità del messaggio in tale modo:
se sono uguali |
OK (il messaggio è autentico ed integro) |
altrimenti |
SCARTA (il messaggio non è autentico) |
Schema generale funzionamento Message Authentication Code:
Gli algoritmi MAC sono una famiglia di funzioni gK parametrizzate con una chiave segreta K aventi le seguenti proprietà:
Inoltre, data una descrizione della famiglia delle funzioni g, per ogni fissato valore di K (sconosciuto ad un avversario) deve possedere la seguente proprietà:
Se la proprietà di computation-resistance non è rispettata, un algoritmo di MAC puo' essere soggetto ad attacchi. Mentre la proprietà di computation-resistance implica la proprietà di key-non-recovery (cioè è impossibile ricavare K, data una o piu' coppie testo-MAC (Mi,gK(Mi))) la proprietà di key-non-recovery non implica la proprietà di computation-resistance (cioè non è sempre necessario conoscere la chiave K per ottenere una nuova coppia testo-MAC non conosciuta).
La sicurezza del MAC significa sicurezza contro le contraffazioni. Il MAC è considerato rotto se un nemico pur non conoscendo la chiave K riesce a trovare il valore MAC con chiave K di un messaggio M il cui valore MAC non è noto. Il nemico si assume possa avere a disposizione un certo numero di coppie di messaggi e del loro corretto valore MAC ottenute 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 obiettivi di un avversario che vuole attaccare un
algoritmo MAC sono: calcolare una nuova coppia testo-MAC per qualche testo
MMi
senza conoscere la chiave K ma avendo a disposizione una o piu' coppie
(Mi
,MACK(Mi )). E' importante quindi che il nostro algoritmo
MAC possegga la proprieta' di computation-resistance
se
piu' coppie testo-MAC sono disponibili o possono essere liberamente scelte
dall'avversario. Uno dei seguenti scenari di attacchi si puo' presentare per il
MAC:
Adesso vediamo due tipi di attacchi:
Attacco sullo spazio della chiave
La chiave di un algoritmo MAC puo' essere determinata utilizzando una ricerca esaustiva. Con la conoscenza di una sola coppia testo-MAC, un avversario puo' calcolare il valore MAC del testo con tutte le possibili chiavi, e controllare quale delle computazioni MAC-valore corrisponde con la coppia conosciuta. Per uno spazio di una chiave di t-bit sono richiesti al piu' 2t calcoli di valori MAC. Per una chiave di t-bit e per un fissato input una scelta casuale di una chiave puo' produrre un corretto m-bit valore-MAC con probabilita' di circa 2-t per t<m.
Attacco sul bitsize di un MAC
Dato un algoritmo MAC che produce un valore MAC di m-bit, con probabilita' di successo di circa 2-m riesco a calcolare il corretto valore MAC dato un fissato input M oppure il corretto M dato un fissato valore MAC. Il problema è che non posso verificare se un valore MAC è il corretto valore MAC di un fissato input M a meno che non conosca la chiave oppure possa utilizzare una black-box che fornisce il corretto valore MAC per un dato input. Idealmente un avversario dovrebbe essere incapace di produrre una corretta coppia testo-MAC con probabilita' significativamente minore di max(2-t,2-m) dove t è il numero di bit di cui è composta la chiave.
Quando è possibile falsificare il MAC (cioe' quando si puo' calcolare il valore MAC di un messaggio M senza conoscere la chiave K) la gravita' della conseguenza pratica dipende dal grado di controllo che un avversario ha sul valore di M per il quale il MAC puo' essere falsificato. Questo grado è differenziato dalla seguente classificazione delle falsificazioni:
Il recupero della chiave del MAC (key recovery) è il piu' danneggiante degli attacchi, indubbiamente la gravita' delle conseguenze di questo attacco è pari al caso selective forgery. Mentre la conseguenza della falsificazione del MAC che permette ad un avversario di far accettare un testo falso come autentico è grave pari al caso existential forgery.
Attualmente esistono varie realizzazioni del MAC, una di queste fa uso di cifrari a blocchi ed il piu' comune algoritmo di questo tipo è il Cipher-Block-Chaining-MAC (CBC-MAC). Questo algoritmo che vedremo di seguito generalmente utilizza il DES come cipher block. Uno dei svantaggi del DES sono le restrizioni riguardanti la sua esportazione dagli U.S.A., in particolare queste restrizioni riguardano la lunghezza della chiave che non puo' essere superiore a 56 bit. Il motivo per cui sono state imposte tali restrizioni non è stato reso noto. Ma è evidente che chi dispone di forti capitali come ad esempio una nazione può crittoanalizzare qualsiasi messaggio cifrato con il DES avente chiave di 56 bit; però bisogna tener presente che ultimamente il governo degli U.S.A. è intenzionato a togliere tali restrizioni e si pensa che lo faccia a breve. Recentemente un comune interesse è stato quello di costruire il MAC utilizzando funzioni hash. Uno dei motivi è indubbiamente la mancanza di restrizioni riguardante la loro esportazione dagli U.S.A., ma anche il fatto che sono piu' veloci dei cifrari a blocchi ed in particolare del DES ed anche perchè sono incluse nelle funzioni di libreria. Uno svantaggio delle funzioni hash è che non sono state originariamente progettate per il MAC e ciò comporta non poche difficoltà nel realizzare il MAC con esse. Comunque esistono algoritmi basati su funzioni hash progettati appositamente per il MAC come MAA ed MD5-MAC che vedremo di seguito.
Il più comune algoritmo di MAC su cifrario a blocchi fa uso di Cipher-Block-Chaining (CBC) ed è detto CBC-MAC. Il CBC-MAC è lo schema di autenticazione dei messaggi nel quale l'etichetta di un messaggio è il risultato dell'ultimo blocco del testo cifrato ottenuto cifrando il messaggio M in modalità CBC con vettore di inizializzazione IV=0.
L'algoritmo CBC-MAC è il seguente:
INPUT: messaggio M; specificazione
del cipher block E; chiave segreta K per E.
OUTPUT: valore MAC di M composto da L bit (dove L è la lunghezza
dell'output prodotto dalla funzione hash utilizzata come cipher block).
Padding and blocking: Il messaggio M viene diviso in blocchi di L bit M1, M2, ... ,Mn , se la lunghezza di M non è multiplo di L si fa padding con 10...0
CBC processing: Sia EK(X) la
codifica del valore X prodotta dal blocco E con chiave K, ogni valore
hi è calcolato
come segue: h1EK(IV
M1),
hi
EK(hi-1
Mi), 2
i
n
Optional process to increase strength of
MAC:
Usando una seconda chiave segreta K'
K calcoliamo : h'n
E-1K'(hn);
hn
EK(h'n).(Questo equivale ad usare
una tripla codifica con due chiavi).
Completion: Il valore MAC di M sono gli L bit di hn
Il processo opzionale (3) riduce il pericolo di
un attacco di ricerca esaustiva senza impatti sull'efficienza media
dell'algoritmo.
In genere come cipher block E si usa il DES, in
tal caso il valore MAC è composto da 64 bit e la chiave segreta è di 56
bit.
La scelta dello spazio dei messaggi è importante per la sicurezza del CBC-MAC. Se sono permessi messaggi di varia lunghezza lo schema risulta insicuro, ma se la lunghezza dei messaggi è ristretta a qualche singolo valore fissato lo schema diventa più sicuro.
RIPE-MAC è una variante del CBC-MAC.
Esistono due versioni:
RIPE-MAC1 e RIPE-MAC3. Entrambe producono un valore MAC di 64 bit, differiscono
per cipher block E che è il singolo DES con chiave di 56 bit per RIPE-MAC1 e il
DES-triplo con chiave di 112 bit per RIPE-MAC3. Le differenze dall'algoritmo di
CBC-MAC sono le seguenti: la funzione di compressione utilizza una migliore
catena non invertibile descritta come CBC con data feed-forward: hi
EK(hi-1
Mi)
Mi ; dopo il
padding del messaggio originario è aggiunto un blocco finale di 64 bit;
l'optional processing dell'algoritmo CBC-MAC è obbligatorio con la cifratura
del blocco finale effettuata usando la chiave K' ottenuta complementando
alternativamente pezzi di K: per K=k0 ... k63 la
corrispondente chiave di 56 bit con bit di parità k7k15
...
k63 è K'=K
0xf0f0f0f0f0f0f0f0.
Successivamente indicheremo per semplicità il messaggio con M, l'impronta del messaggio (che corrisponde al suo valore MAC con chiave K) con Y=MAC(M,K), e l'operazione di concatenazione con il simbolo '||' .
Il MAC non si occupa della segretezza dei dati (infatti M ed Y viaggiano in
chiaro sulla rete e chiunque può leggerli ) ma si occupa dell'integrità e
dell'autenticità degli stessi. Se si vuole aggiungere confidenzialità, si può
cifrare con una
diversa chiave condivisa K' il messaggio M e il rispettivo valore MAC e quindi
il messaggio spedito sara' C=EK'(M||MACK(M)) dove E è un
algoritmo di cifratura simmetrico con chiave condivisa K'K.
Uno dei vantaggi di questa tecnica è che se l'algoritmo di cifratura viene rotto il MAC ancora garantisce l'integrita' di M, in piu' la cifratura del valore MAC preclude un attacco di ricerca esaustiva sulla chiave MAC. Uno svantaggio è la richiesta di utilizzare piu' chiavi, una per la cifratura ed una per il MAC. Si deve inoltre assicurare che la dipendenza fra il MAC e l'algoritmo di cifratura non comprometta la sicurezza, è quindi raccomandato che questi algoritmi siano indipendenti (vedi esempio alla fine del paragrafo). Vediamo adesso due alternative a tale metodo:
Esempio:
(impropria combinazione di CBC-MAC
e CBC cifratura). Consideriamo l'uso del
meccanismo di integrità di dati
C=EK'(M||MACK(M)) dove
EK' è un CBC-algoritmo con chiave K' e vettore di
inizializzazione IV, MACK(M) è CBC-MAC con chiave K e vettore di
inizializzazione IV' e che K=K' e IV=IV'. Il messaggio M suddiviso in blocchi
di lunghezza uguale
M1,M2, ... ,Mn cosi' come previsto
nell'algoritmo di
CBC-MAC,
puo' allora essere processato in un singolo CBC passaggio.
Infatti il CBC-MAC è uguale all'ultimo ciphertext block
hn=EK'(hn-1 Quindi bisogna fare attenzione nel
combinare un MAC con uno schema di
cifratura.
In generale, è consigliato utilizzare distinte (e idealmente, indipendenti)
chiavi. L'indipendenza delle chiavi evita che un attacco con successo
sull'algoritmo di cifratura comprometti l'autenticazione (o
vice-versa).
Le proposte di costruzione di MAC basate sulle funzioni hash che considereremo
sono: Successivamente indicheremo l'operazione di concatenazione
con il simbolo
'||' . Consideriamo un messaggio M
suddiviso
in blocchi di taglia uguale M1,M2, ...
,Mn ,
ed una funzione
hash iterata secondo il modello generale di funzione hash, con
funzione di compressione f , con definizione: h0=IV,
hi=f(hi-1,
Mi) per 1
Supponiamo di voler usare H come un algoritmo MAC pre-aggiungendo una
chiave
segreta K al messaggio M, cosicché il MAC proposto di M sarà
MACK(M)=H(K||M).
Un
nemico estendendo il messaggio M di un blocco x,
potrebbe ricavare
MACK(M||x) come f(H(K||M),x) (infatti f(H(K||M),x)=H(K||Mx)) senza
conoscere la chiave segreta K (il MAC
originale è utilizzato come variabile di concatenamento)(padding attack).
Questo è vero anche
per le funzioni come MD4 in cui il pre-processo di padding aggiunge un ultimo
blocco z di 512-bit contenente 448 bit di zero seguiti da 64 bit contenenti la
lunghezza del messaggio originario M. Questa misura aggiuntiva non allevia il
padding attack in quanto l'attaccante può includere questo blocco aggiuntivo del
messaggio originario come parte del messaggio da falsificare (cioè del messaggio
di cui si vuole dedurre il MAC senza conoscere la chiave K) [6]. Questo attacco è
possibile in quanto l'attaccante conosce il funzionamento di MD4, il valore del
messaggio M e il MAC di M. Una ulteriore contromisura per questo tipo di
attacco potrebbe essere di includere
la lunghezza del messaggio M come parte del primo blocco. Per simili ragioni, è insicuro utilizzare una funzione
hash per costruire un algoritmo MAC usando la chiave K come IV. Se K
comprende
l'intero primo blocco, allora f(IV,K) puo' essere pre-calcolata, dimostrando
che
un
avversario ha solo bisogno di trovare un K' (non necessariamente K) tale che
f(IV,K)=f(IV,K') e questo equivale ad utilizzare un segreto IV. Il metodo del suffisso segreto utilizza come il metodo del
prefisso segreto una funzione hash iterata H con funzione di compressione
definita come sopra, con la differenza che la chiave segreta K
viene utilizzata come suffisso al messaggio M. Quindi l'input della funzione
hash H sara' il valore M||K ottenuto post-aggiungendo al messaggio M la
chiave
segreta K, ed il MAC proposto di M sarà H(M||K) (costituito da j bit).
Se H utilizza la
chiave segreta K solo nell'ultimo passo puo' essere applicato a tale metodo
l'attacco
del compleanno in quanto se H(M)=H(M') abbiamo che H(M||K)=H(M'||K)
per
M Infatti
un avversario scegliendo liberamente il
messaggio M, in
O(2|hash(.)|/2) operazioni riesce a trovare una coppia M, M' (dove
M Quindi un avversario ottenendo un giusto MAC su M
puo' produrre una corretta coppia testo-MAC per un nuovo messaggio
M' In questa debole forma di MAC, il valore-MAC
dipende solo dall'ultima iterazione della funzione hash.
Mn), cioè
hn=MACK(M).
Assegnando un ultimo blocco di dati Mn+1 =
hn produco il finale ciphertext block
hn+1=EK'(hn
Mn+1)=EK'(MACK(M)
MACK(M))=EK'(0). La
cifratura
del MAC è quindi indipendente sia dal testo in chiaro che dal testo cifrato,
rendendo il meccanismo d'integrità completamente insicuro.
6. MAC basati su funzioni hash
6.1 Metodo del prefisso
segreto
i
n,
H(M)=hn.
6.2 Metodo del suffisso segreto
Una proposta alternativa al metodo del prefisso segreto è
il metodo del
suffisso segreto.
M'.
M')
tale che H(M)=H(M') ( |hash(.)| è la lunghezza dell'output della funzione hash
utilizzata). Questo puo' essere fatto off-line, e non è richiesta la
conoscenza della chiave K.
M.
6.3 Metodo dell'inviluppo con
padding
Dato un messaggio M il rispettivo valore MAC viene calcolato in tale
modo:
dove H è una funzione hash e p è una stringa usata per fare il padding della chiave segreta K affinchè raggiunga la lunghezza di un blocco, in modo da assicurare l'utilizzo di almeno due iterazioni per il calcolo del MAC.
Per esempio se H è MD5 e K è di 128 bit, allora p è una stringa lunga 384 bit.
HMAC è usata in combinazione con una funzione hash ed usa una chiave segreta K per il calcolo e la verifica del MAC. La funzione hash è utilizzata in modo black-box così che può essere implementata con il codice disponibile ed un eventuale suo rimpiazzamento a causa della sicurezza o delle prestazioni può essere effettuato agevolmente. Gli obiettivi che sono dietro la costruzione di HAMC sono:
usare una funzione hash disponibile senza modificarla, in particolare una funzione hash che operi bene nel software e il cui codice è distribuito gratuitamente;
conservare le originali prestazioni della funzione hash;
usare la chiave in modo semplice;
avere una buona e comprensibile analisi crittografica della forza del meccanismo di autenticazione basata su ragionevoli assunzioni che sono alla base della funzione hash utilizzata;
permettere un facile rimpiazzamento della funzione hash utilizzata nell'eventualità che una funzione hash piu' veloce e piu' sicura sia disponibile.
Sia M il messaggio al quale la funzione MAC deve essere applicata, sia H la funzione hash utilizzata da HMAC. Assumiamo che H è una funzione hash iterata che usa una funzione di compressione che opera su blocchi di B byte (B=64 per la maggior parte delle funzioni hash). Sia K la chiave segreta e condivisa dell' autenticazione del messaggio delle due parti, se la chiave ha lunghezza maggiore di B byte si calcola il valore hash di K cioe' h(K) per ottenere una nuova chiave K=H(K) di L byte (dove L è la lunghezza dell'output della funzione hash utilizzata). Se K ha lunghezza minore di B byte sono aggiunti degli zeri per rendere la lunghezza di esattamente B byte. Fissiamo inoltre due differenti stringhe di B byte "ipad" e "opad" come segue:
( x||y equivale a: y è accodato ad x).
I passi svolti dalla funzione HMAC supponendo che B=64 byte sono i seguenti:
Il costo totale dell'autenticazione del messaggio M è prossimo a quello del calcolo della funzione hash del messaggio specialmente se M è grande. 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.
La chiave utilizzata per HMAC puo' avere qualsiasi lunghezza, anche se è sconsigliato utilizzare una chiave con meno di L byte (dove L è la lunghezza dell'output della funzione hash utilizzata) in quanto diminuirebbe la sicurezza della funzione hash. Mentre una chiave di lunghezza maggiore di L byte non incrementa in modo significativo la forza della funzione. La chiave deve essere scelta casualmente, cambiata periodicamente e deve essere tenuta segreta da entrambi gli utenti che la condividono.
Diversi algoritmi MAC troncano il loro output, ossia utilizzano come MAC solo i primi t byte del loro output. Quando è usato un HMAC troncato solo i primi t byte del risultato prodotto da HMAC sono utilizzati come MAC. La lunghezza di t non dovrebbe essere minore di L\2 in ogni caso t non deve essere meno di 80 bit. Una notazione proposta è la seguente: HMAC-H-t che indica la realizzazione di HMAC utilizzando la funzione hash H e l'output è di t-bit; ad esempio HMAC-SHA1-96 indica un HMAC realizzato utilizzando SHA-1 con l'output troncato a 96 bit. Il vantaggio dovuto al troncamento è dato da una minore informazione che si da' all'attaccante, lo svantaggio invece consiste in un minor numero di byte da predire all'attaccante.
Come gia' detto le funzioni hash non sono originariamente progettate per l'autenticazione dei messaggi. In particolare esse non sono delle primitive con chiave , e non è chiaro quale sia la chiave migliore per loro. In questo modo è necessario essere particolarmente attenti nell'adottare una funzione hash per il MAC. La massima che guida la costruzione di HMAC è stata: 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 e SHA). Cio' che si è mostrato è che se la funzione hash ha proprietà di sicurezza allora HMAC è sicuro. Quindi l'unico modo in cui HMAC potrebbe fallire è se la funzione hash utilizzata da esso fallisce. Le caratteristiche di sicurezza possono essere così riassunte: 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. Quindi HMAC ha prestazioni che sono essenzialmente quelle della funzione hash utilizzata.
I risulati intermedi (K ipad)
e (K
opad) possono
essere precomputati. Questi risultati intermedi possono essere conservati e
usati per inizializzare H ogni volta che bisogna autenticare un messaggio con
la
chiave K. Questi risultati bisogna conservarli e proteggerli come il valore di
una chiave segreta.
In questo paragrafo descriveremo l'utilizzo combinato di HMAC con SHA-1 come un meccanismo di autenticazione. L'algoritmo di HMAC ha una struttura progettata per ospitare al suo interno una funzione hash. In HMAC-SHA-1-96 è utilizzata come funzione hash la funzione SHA-1. Infatti la sigla HMAC-SHA-1-96 sta ad indicare un algoritmo HMAC che utilizza come funzione hash SHA-1 con output troncato a 96 bit. HMAC-SHA-1-96 fornisce l'autenticazione e la protezione dell'integrita' dei dati, in altre parole il suo obiettivo è di assicurare che il pacchetto di dati sia autentico e che esso non sia stato modificato durante la trasmissione. HMAC-SHA-1-96 opera su blocchi di dati di 64-byte. Il paddding è completamente effettuato da SHA-1. L'output prodotto da HMAC-SHA-1-96 è un valore MAC di 160-bit valore che viene troncato a 96-bit. In caso di spedizione di dati solo il valore troncato di 96-bit viene utilizzato come MAC e memorizzato nel campo autenticazione. Mentre in caso di ricezione di dati l'intero valore MAC di 160-bit è calcolato e solo i primi 96-bit sono confrontati con il valore memorizzato nel campo autenticazione. HMAC-SHA-1-96 utilizza una chiave segreta di 160-bit. La lunghezza della chiave è stata scelta in base alle raccomandazioni fatte sulla lunghezza della chiave per HMAC. La sicurezza fornita da HMAC-SHA-1-96 è basata sulla forza di HMAC, ed in grado minore, sulla forza di SHA-1.
Il tempo di esecuzione(escludendo l'espansione della chiave)è proporzionale alla lunghezza del messaggio.
Un'altra tecnica per costruire MAC da una funzione hash è di progettare una funzione di compressione MAC che dipende da K; in pratica la chiave segreta K deve essere coinvolta in tutte le iterazioni. Questo provvedimento addizionale protegge nel caso in cui il punto debole dei sottostrati delle funzioni hash venisse a conoscenza. L'algoritmo seguente utilizza questa tecnica ed è costruito usando MD5.
o Algoritmo MD5-MAC
INPUT: stringa M di b bit dove b0; la chiave
K di
128 bit.
OUTPUT: valore MAC di M di 64 bit
(l'operazione di concatenazione è indicata con il simbolo " |
" )
MD5-MAC è ottenuto da MD5 con i seguenti cambiamenti: