A cura di Antonio Parziale
Pubblicato il 19/05/2005
Le funzioni hash sono delle funzioni a senso unico (ovvero dall’uscita non si riesce a recuperare l’ingresso) che forniscono un riassunto del messaggio iniziale. L'articolo è tratto dalla tesi di laurea in "Applicazione delle tecniche di crittografia nella trasmissione ed elaborazione dati" redatta dall'ingegnere Federico Gennari nell'anno accademico 2000/2001.
8.7 – funzione di hash
Le funzioni hash, già incontrate alla fine del capitolo 3, sono delle funzioni a senso unico (ovvero dall’uscita non si riesce a recuperare l’ingresso) che forniscono un riassunto del messaggio iniziale. Essendo questo messaggio praticamente irripetibile con messaggi diversi, è anche definito come impronta digitale del testo, particolarmente utile per la sua autenticazione; naturalmente le proprietà citate sono valide a livello teorico, nella pratica se non soddisfatte appieno sono punti deboli. L’autenticazione riguarda varie punti: convalidare l’identità della sorgente, proteggere l’integrità del messaggio, il non ripudio dell’azione/risoluzione delle dispute, l’applicazione di una marcatura temporale che ne certifichi la data di creazione, ed altro.
Il MAC (Message Authentication Code) fornisce dunque a ciò, ed è spedito insieme al messaggio. Esso è generato tramite un algoritmo che sfrutta il messaggio stesso ed una chiave, privata o pubblica, nota al mittente ed al ricevente; se il MAC sfrutta una funzione hash, la sua uscita è di lunghezza fissata, in genere considerevolmente più piccolo del messaggio originale, cosicché risulta più veloce e maneggevole di una firma digitale completa.
In genere per la verifica di un MAC, che è spedito assieme al messaggio come già anticipato, il ricevente calcola per conto proprio il MAC col messaggio arrivato e la chiave (che funge da firma univoca). Se il suo MAC e quello ricevuto coincidono, la verifica ha successo. Una marcatura temporale (timestamping) in genere è consegnato da una entità preposta che usa delle chiavi particolari pubbliche, dette “numeri sommari”, con cui firma l’hash del testo (di modo che la marcatura sia applicato senza vedere il contenuto da proteggere). La verifica del certificato temporale controlla la data annunciata usando il “numero sommario” che era in vigore in quel momento, e se i certificati coincidono la verifica ha avuto riscontro positivo.
Come già detto, l’ingresso di una funzione hash è di lunghezza qualsiasi, mentre l’uscita può variare dai 128 ai 512 bit, in relazione al grado di sicurezza che si vuole ottenere contro eventuali collisioni (cioè due ingressi che danno la stessa uscita), detti anche attacchi del compleanno (*). L’algoritmo funziona spezzando il messaggio in blocchi ed applicando iterativamente la funzione di compressione con in ingresso il blocco dati e l’uscita precedente; il primo stadio usa il primo blocco dati e un vettore iniziale.
Gli attacchi del compleanno sono una sottoclasse degli attacchi a forza bruta; se una funzione, quando gli sono forniti ingressi casuali, fa uscire k valori equiprobabili, allora valutando iterativamente la funzione per ingressi differenti, ci si aspetta di ottenere la stessa uscita dopo 1,2k1/2 prove. Se invece stiamo cercando una collisione allora ci si aspetta che dopo aver provato 1,2(2n/2) possibili ingressi, si abbia qualche collisione (questi studi sono stati portati avanti da Van Oorschot e Wiener). Yuval invece ha proposto la seguente strategia basata sul paradosso del compleanno, dove n è la lunghezza del riassunto del messaggio:
- L’avversario sceglie due messaggi: il messaggio obiettivo da firmare ed un messaggio innocuo che l’utente legittimo vuole probabilmente firmare.
- L’avversario genera 2n/2 variazioni del messaggio innocuo, tutti aventi lo stesso significato, ed i loro corrispettivi riassunti. Quindi genera un ugual numero di variazioni del messaggio obiettivo da sostituire.
- La probabilità che una delle variazioni del messaggio innocuo coincida con una variazione del messaggio obiettivo è maggiore di ½ in accordo col paradosso del compleanno.
- L’avversario ottiene la firma dell’utente sulle variazioni del messaggio innocuo.
- La firma è rimossa dal messaggio innocuo ed attaccata alla variazione del messaggio che genera lo stesso riassunto. L’avversario ha con successo falsificato il messaggio senza scoprire la chiave di cifratura.
I più comuni algoritmi hash sono lo SHA e la serie MD. Il primo è stato progettato dalla NIST, su richiesta della NSA, nel 1993, revisionato nel 1995 come SHA-1 (i dettagli rivisti non sono noti al pubblico) e produce uscite a 160 bit, il che lo rende molto resistente ma anche leggermente più lento di altri. Mentre l’algoritmo è chiamato SHA, lo standard applicato è noto come SHS. La serie MD2/MD4/MD5 è costituita dagli algoritmi ideati da Rivest (la R del RSA) con uscite a 128 bit, e sono adottati come standard internet (la versione più recente, e migliore, è MD5 e lo standard internet è riferito come RFC1321). Il MD2 e MD4 sono considerati violati, perciò sono consigliabili lo SHA e MD5. Altri algoritmi famosi sono anche l’HAVAL e il RIPEMD-160.