Differenza tra "Integrità" e "Segretezza" (a cura del Dottor Antonio Guzzo Responsabile CED Sistemi Informativi del Comune di Praia a Mare) Quando ci riferiamo ai concetti di integrità e sicurezza ed alle sue tecniche è necessario basarci sul concetto di hash inteso come una funzione univoca operante in un solo senso (ossia, che non può essere invertita), atta alla trasformazione di un testo di lunghezza arbitraria in una stringa di lunghezza fissa, relativamente limitata. Tale stringa rappresenta una sorta di "impronta digitale” del testo in chiaro, e viene detta valore di hash, checksum crittografico o message digest. Per quanto riguarda la segretezza, l’hash non è detto che serva. Qual è il ruolo degli algoritmi di hash? E’ quello dell’integrità cioè l’hash ci garantisce l’integrità dell’informazione ma non ci garantisce la segretezza dell’informazione e ci consente di capire i campi di applicabilità. Facciamo un esempio concreto. Abbiamo un sito web, ad es, alice invia un documento a bob ed inoltre alice su una pagina di giornale pubblica il documento che ha inviato a bob è questo l’uso corretto della tecnica hash. La tecnica hash ci serve per assicurare il destinatario relativamente all’integrità dell’informazione che ci sta inviando e quindi alice manda un documento a bob, a bob arriva un documento. Quel documento è stato modificato? Il modo migliore è quello della pubblicizzazione nel senso alice sul giornale comunica che l’hash del documento che ho dato a Bob è questo. Questo è quello che si intende per integrità, perché dato un file e l’hash di un file, cioè il numero che ricavo da un file è molto difficile trovare un file modificato tale che l’hash del file modificato sia uguale all’hash del file. Invio un documento in rete e rendo pubblico, il più possibile, il suo hash Dati file + hash(file) è molto difficile trovare file_modificato tale che: hash(file_modificato) = hash(file) Da qui si deduce che con l’utilizzo delle tecniche di hash l’obiettivo perseguito è l’integrità, non la segretezza Quando parliamo di integrità ci riferiamo al caso in cui l’attaccante non può modificare il messaggio perché ho reso pubblico l’estratto del documento, questo estratto forte del documento e d’altro canto la cifratura non garantisce l’integrità del dato. Se io ricevo un documento cifrato, non significa che lo stesso sia integro ed originale ma può essere stato modificato perché un attaccante è in grado di modificarlo senza riuscirlo comunque a leggere. Una cosa è cifrare un dato, un documento mentre una cosa è renderla illeggibile modificandola. Un esempio ci viene dato dalle cosiddette aste on line nelle quale si verifica il seguente fenomeno: un attaccante volendo potrebbe cambiare la mia cifra di partecipazione all’asta senza conoscere quanto valeva prima. Un altro esempio più banale è quello dell’algoritmo RSA nel quale la cifra è il messaggio elevato ad un esponente modulo di un certo valore e si torna al messaggio originale che è la cifra elevata ad un altro esponente modulo lo stesso valore. Ma se io cambio un bit del messaggio cifrato, quando qualcuno lo va a decifrare al posto del messaggio ottiene un altro messaggio. La cifratura, di per se, non garantisce l’integrità, un attaccante può essere in grado di modificare il messaggio senza poterlo leggere (ES: asta on line). Un attaccante può essere in grado di modificare il messaggio, a volte lo fa in modo logico, a volte ne cambia un solo bit. Ciò viene affermato dai fautori dell’RSA:“RSA encryption is intended primarily to provide confidentiality… It is not intended to provide integrity” (from RSA Labs Bulletin) cioè l’rsa encryption è intesa in primis per fornire confidenzialità cioè segretezza dell’informazione . Non è intesa per fornire integrità. Alcuni sistemi di cifra assicurano contemporaneamente segretezza e integrità. Quando si parla di tecniche riferite ad integrità e segretezza ci si riferisce alle cosiddette tecniche di hash. Se abbiamo un documento x, questo è l’hash di x che ha una lunghezza prefissata ad es. di 128 bit. Questa è la regola fondamentale delle tecniche hash cioè l’hash di un documento deve essere possibilmente diverso da quella di un altro documento. In caso contrario uno potrebbe scambiare i documenti lasciando l’hash inalterato. Quindi se faccio un hash che non funziona a questo punto si verificano le cosiddette collisioni cioè si verifica una situazione che avviene quando due diversi input producono lo stesso output tramite una funzione hash. Si veda in dettaglio il seguente grafico: Dobbiamo fare in modo che queste collisioni non ci siano cioè in sostanza si ha un universo grande di documenti ed un universo un pò più piccolo di numeri, l’hash fa questo, prende uno di questi e lo mette in comunicazione con un altro di questi e viceversa. Ad un certo punto i pallini dell’universo più piccolo che è in coda all’hash finiscono, allora bisogna fare in modo che finiscano il più tardi possibile, anche se comunque di potenziali documenti c’è ne ho infiniti, mentre i numeri hash se fossero esattamente tanti quanti sono i potenziali documenti allora si verificherebbe un ammanco di documenti. Ad un certo punto però troverò uno di questi tra questi tantissimi che collide. Ma quant’è grande questa collisione?. Facciamo una prova. La funzione di hash non è iniettiva, di tipo one-way. Facciamo l’esempio dell’algoritmo SHA1 che converte da uno spazio a dimensione infinita ad uno spazio largo 160 bit. Questo è lo SHA1. Quanti diversi valori si possono fare con 160 bit? 2 alla 160 diversi valori. Quanti diversi documenti x1, x2, etc devo prendere per riuscire a trovare i due documenti che mi danno lo stesso hash? Sicuramente ne dovrò trovare 2 alla 160 per essere sicuro che questo sia vero. Quanto appena detto in realtà non è vero. Questa situazione è meglio rappresentata dal cosiddetto paradosso del compleanno. Io ho 100 persone in una stanza. Che probabilità ho che due di queste persone siano nate lo stesso giorno? Ad occhio è maggiore o minore del 50%? Intuitivamente saremmo portati a dire che è minore, in realtà però è maggiore perché se io ho 100 persone la probabilità di nascita dei due persone lo stesso giorno è n su 2 binomiale (le cosiddette combinazioni) che è uguale a n fattoriale diviso n-2 fattoriale per 2 fattoriale= n per n-1 per n-2 fattoriale diviso n -2 fattoriale per 2 fattoriale = n per n-1= n al quadrato cioè significa che su 10 persone creo 100 possibili coppie. Alla fine passano 23 persone per una probabilità superiore al 50%. Si può fare questo conteggio anche utilizzando il calcolo delle probabilità. Io prendo una persona, ne prendo una seconda che probabilità c’è che la seconda persona sia nata lo stesso giorno della prima? 1/365. Nel secondo caso prendo una persona ed ipotizzo che la seconda persona non è nata nello stesso giorno. Che probabilità ci sono che non sia nata nello stesso giorno? 364/365. Che probabilità ci sono che sia nata lo stesso giorno? 1/365. Esaminiamo ora il paradosso del compleanno con le tecniche di hashing. Io voglio trovare t che è il numero di possibili valori di x che dobbiamo scandire prima di trovare una collisione. Ala collisione si verifica quando ad un certo punto trovo un documento , trovo che l’hash di un documento è uguale a quello di un altro. Qual è questo numero minimo di valori che devo scandire? Intuitivamente dobbiamo rispondere 2 elevato a 160 bit se l’hash è 160 bit invece non è cosi. Supponiamo di avere tante coppie x1, x2, etc, prese due qualsiasi x e x3, che probabilità ci sono che l’hash di x sia uguale a quello di x3? Quanto è grande il nostro spazio? 160 bit? Diciamo che n=1/2 elevato ad n perché l’universo dell’hash è 2 alla n possibili valori, il secondo ci ha probabilità 2 alla n. Ma quante possibili coppie x, x1, etc dobbiamo guardare prima di arrivare alla prima collisione? Le dobbiamo guardare ad un numero che è compatibile con 2 alla n per cui il numero delle coppie da guardare è circa 2 alla n ma quante coppie ho in totale?Per cui il numero è (t per t-1 fratto 2), un numero che è paragonabile a t quadro. Per cui nel caso dello SHA1 non devo guardare 2 allo 160 ma 2 alla 80 documenti perché ottengo tante coppie che m fanno 2 allo 160 coppie. E’ lo stesso paradosso del giorno di nascita. Passiamo ora ad esaminare le funzioni hash più utilizzate che sono l’MD5 che aveva uno spazio di valori di 128-bit output ideata da Ron Rivest, ancora molto utilizzata. L’MD5 è stata in informatica la prima funzione hash che è stata utilizzata. Dato che l’MD5 è stata la prima funzione hash ci sono tantissimi sistemi che ancora la usano anche se è stata trovata una tecnica relativa alle collisioni nel 2004. Nel caso concreto se noi firmiamo con l’MD5 in pochi minuti un nuovo computer è in grado di trovare un documento che va in collisione con quello che è stato generato in precedenza. Per l’appunto è stata fatta una variante a 160 bit (RIPEMD-160) che ha avuto un po’ di fortuna che è stato adottato come standard dal NIST, lo SHA-1 (Secure Hash Algorithm) 160-bit. Pero ultimamente il governo statunitense, ha stabilito che a partire dal 2007 deve essere sostituta con SHA-224/256algoritmo di hash e nel 2010 non ci devono stare più implementazioni di SHA1 in quanto hanno trovato un algoritmo O( 2 elevato a 63) che riesce a bucare ed a trovare una collisione per SHA1. Questo è un problema molto grave perché l’hash SHA1 è quello maggiormente usato dalla Digital Security Standard. Questa è una scelta molto forte ed ha un forte impatto economico ed organizzativo. Le tecniche hash sono delle tecniche che consentono di assicurare la correttezza e quindi la integrità dell’informazione e non la sua segretezza. L’hash ci consente di dire su una rete posso mandare un informazione ed ho un modo per dire che questa informazione non è stata modificata ad esempio tramite e-mail, aste on line etc. Quindi l’hash può servire come verifica di integrità ma anche come prova a posteriori del fatto che ho inviato quella determinata richiesta. Abbiamo esaminato la differenza fra integrità e segretezza e che l’RSA non serve a proteggere e garantire l’integrità dell’informazione ma serve a garantire la segretezza dell’informazione stessa. Passiamo ora ad esaminare dei casi specifici. Ad esempio log-in al sistema operativo (inseriamo le credenziali di autenticazione), per le pwd di accesso all’applicazione una delle regole è che la pwd deve essere difficile da scoprire. Un modo per evitare che la pwd sia pubblica è quella dell’utilizzo di tecniche di hash. Tutto ciò significa quando si effettuerà il log-in alla macchina il sistema farà l’hash e lo confronterà con quello presente sulla macchina per cui non avrà bisogno di conoscere la pwd ma solo dell’hash. L’integrità per esempio è una sorta di istituto. Facciamo l’es. di un comune che decise di distribuire la firma elettronica e la fece al suo interno. Fu fatta una richiesta normativa e tecnica al Ministero degli Interni. Il Comune mise a disposizione il software di firma il quale però non era certificato e questo si creò un grosso problema di sicurezza, cioè chiunque avrebbe potuto modificare un documento alterando atti amministrativi di una certa importanza. Facciamo l’esempio di un asta , alice fa un offerta, trasmette l’hash e non un valore (send) e solo successivamente trasmette un valore per cui gli altri non sanno quanto e stato offerto. La funzione di hash deve essere gestita correttamente altrimenti si verificano delle criticità. Le funzioni hash più utilizzate sono l’MD5 ma è stato superato il suo relativo problema, lo SHA1 a 160 bit soltanto che il governo usa ha cambiato come accennato in precedenza. Come dicevamo in precedenza questi algoritmi possono essere più lenti, quello che io ad esempio per fare uno SHA1 impiego un millisecondo, per fare un SHA2 ci metto un decimillisecondo e quindi meno tempo. La scelta della sicurezza però impatta sulle performance oppure sull’organizzazione del lavoro. Un’altra tecnica di hash (si chiama HMAC) è quella che consente di fare l‘hash del messaggio più la chiave che è cosi formalizzata: Message Autenthication Code = hash(messaggio +chiave). Quindi per mandare un messaggio al mio corrispondente decido una chiave e mando sia il messaggio che la chiave, mando l’hash del messaggio più la chiave. Quindi per ogni messaggio uguale mandato a persone diverse passeranno sulle rete dati diversi, se A deve parlare con B e C a ha deciso una chiave tra A e B ed una chiave tra A e C per cui sulla rete ho due firme diverse. L’HMAC è anche utilizzato in IP security e in SSL/TLS. Ci avviciniamo così al concetto di unicità dell’informazione. Infine un’altra tecnica di hash è quella chiamata DSS che è l’hash per “Digital Signature Standard (DSS)”. Si potrebbe utilizzare anche la cifratura al posto dell’hash ma, in software l’hashing è più veloce della cifratura (Bellare, Canetti, and Krawczyk nel 1996).