Briciole ... tra i numeri

Alcuni dei miei passaggi su blog di natura didattica.
Matematica, scienze, numeri e giochi di logica,
riflessioni, sfide personali e sprazzi di neuroni impazziti.


Questi articoli sono stati ospitati da due dei migliori blog
che trattano matematica e scienze in generale.


Scienze ... giocando o quasi Percorsi di apprendimento scientifico alternativi al manuale scolastico,
favorendo collaborazioni con docenti e alunni di altri contesti
Blog sulla matematica dedicato agli studenti Spazio dedicato alla matematica applicata
con articoli di didattica scientifica e metodologia generale
Visita la sezione DIDATTICA.ndo ed usufrusci delle risorse didattiche a disposizione

Elenco contenuti
Pubblicato il 06/01/2013 su Matem@ticamente
 

Sicurezza informatica grazie alla matematica

Algoritmi di hash… e non solo impronte digitali

 

Sicurrezza dei dati in informaticaE adesso sicuramente vi aspettate di leggere qualcosa riguardo a crittografia, cifratura, RSA, IDS, NIDS, DDoS, HTTPS, SSL, TLS, SSH … ISO-OSI … e chi ne ha più ne metta di acronimi che vengono immediatamente in mente quando normalmente di parla di informatica e sicurezza dei dati. Alla domanda: Chi o cosa permette la sicurezza dei dati e della loro trasmissione? , genericamente si risponde: La Matematica, e magari ci si aggiunge un qualche riferimento alla sfilza di acronimi esistenti. Troppo spesso però si omette di parlare degli algoritmi di Hash. Probabilmente perché sono in pochi a conoscerli, eppure loro sono sempre li, presenti ed inossidabili ogni qual volta si ha a che fare con la sicurezza informatica.

 

“Sminuzzare, pasticciare”: così Wikipedia traduce il termine “hash”, una polpettina fatta di avanzi di carne e verdure. Quindi “hash”, nell’inglese comune sta ad indicare una cosa fatta male, confusionaria. Vedremo che non è proprio così. Ma qual è il legame fra questo concetto e l’informatica? L’informatica, o meglio ancora la matematica, non lascia spazio ad imprecisioni o sbavature: un singolo bit che cambia, un misero 1 al posto di un apparentemente insignificante 0 potrebbe causare conseguenze catastrofiche.

Innanzitutto cerchiamo di capire cos’è una funzione hash e proviamo a farlo in termini semplici. Un classico paragone è l’impronta digitale: nel corso del tempo, in ambito informatico, si è rivelato necessario trovare un modo di ottenere una sorta di impronta digitale di un file, e questa impronta doveva poter essere utilizzata esattamente così come utilizziamo le impronte digitali “umane”.


L'hash è una sorta di impronta digitale dei fileOgnuno di noi ha la propria impronta univoca che lo accompagna per tutto il corso della vita; se noi quindi confrontiamo due impronte digitali e riscontriamo che sono diverse, concludiamo che appartengono a persone diverse. Lo stesso avviene per i file e le funzioni hash: se confrontiamo due digest (il termine tecnico per indicare l’impronta digitale di un file prodotta da una funzione hash) e riscontriamo che sono diversi, concludiamo che anche i due file di partenza sono tra loro diversi. Questo aspetto ha anche un risvolto fondamentale: è sufficiente effettuare una minuscola modifica al file di partenza per ottenere digest completamente diversi e questa importante proprietà viene spesso utilizzata per controllare l’integrità dei dati trasferiti da un PC ad un altro, da remoto, ma anche durante una semplice copia o un backup.


Ma vediamo allora la definizione precisa di funzione hash, sempre con l’aiuto di Wikipedia:

“Nel linguaggio matematico e informatico, la funzione hash è una funzione non iniettiva che mappa una stringa di lunghezza arbitraria in una stringa di lunghezza predefinita.”

Adesso, invece, cerchiamo di tradurla in italiano comprensibile e lo facciamo dividendo la definizione in due parti.

“[..] la funzione hash è una funzione non iniettiva”. Il termine iniettiva non dovrebbe essere nuovo per coloro che masticano un po’ di matematica, in quanto è un concetto di base riguardante le funzioni. Per coloro che sono all’oscuro del significato di questo termine, non c’è di che aver timore, il suo significato è molto più semplice di quanto possa sembrare.

Schema funzione iniettiva in matematicaImmaginiamo una funzione che ci restituisca la lettera dell’alfabeto corrispondente ad una precisa posizione. Restituisce A quando gli chiediamo la prima lettera, B la seconda, ecc … Questo tipo di funzione restituirà sempre la stessa lettera a partire dalla stessa posizione: non è possibile infatti che la lettera B sia contemporaneamente la seconda e la terza lettera dell’alfabeto. Bene, una funzione di questo tipo è detta iniettiva: non è possibile che restituisca risultati uguali a partire da parametri diversi.

Una funzione hash è l’esatto opposto perché è appunto non iniettiva ovvero, passando parametri diversi ad una funzione hash è possibile che essa restituisca lo stesso digest.

 “[..] mappa una stringa di lunghezza arbitraria in una stringa di lunghezza predefinita”. La lunghezza del parametro passato alla funzione hash può essere di lunghezza arbitraria, ma la lunghezza del digest sarà sempre costante.


Ricapitolando, quindi, una funzione hash è una funzione che:

  1. Può restituire lo stesso digest anche a partire da input diversi
  2. Restituisce un digest di lunghezza costante

Di fondamentale importanza è il secondo punto. Il fatto che una funzione hash restituisca digest di lunghezza costante vuol dire che ci saranno sempre e comunque due input diversi che hanno lo stesso hash ed è in questo caso che si parla di collisioni, che approfondiremo a breve.

A questo punto, manca un ultimo aspetto da descrivere che è l’irreversibilità di un hash. La funzione non permette infatti di risalire al testo che ha generato l’hash, ed è qui che molti confondono un digest con un testo cifrato. La crittografia, come vedremo, è uno dei principali campi di applicazione delle funzioni hash, ma c’è un’importante distinzione da fare: mentre gli algoritmi di cifratura permettono anche il processo inverso (decifrazione), i digest sono unidirezionali, non permettono cioè di risalire al testo che lo ha generato. Almeno non prima che finisca l’universo, ma anche questo lo vedremo a breve.

Differenza tra criptaggio e hash

 

 

Le collisioni

Il principio dei cassetti in matematica ed informaticaAbbiamo detto che quando una funzione hash produce lo stesso digest a partire da due input diversi abbiamo una collisione per quella determinata funzione. E questo è spiegabile dal fatto che essendo la quantità di input molto grande (potenzialmente infinita) e il risultato di dimensione fissa, devono obbligatoriamente esistere collisioni per il principio dei cassetti: se abbiamo 10 piccioni da mettere in 9 cassetti, un cassetto dovrà contenere per forza 2 piccioni.

Le collisioni sono un aspetto importantissimo delle funzioni hash, poiché ne rappresentano il canone di misura della qualità. La qualità di un hash viene misurata infatti dalla difficoltà nel trovare testi che generano lo stesso digest. È sufficiente che venga trovata una sola collisione affinché l’algoritmo venga dichiarato potenzialmente insicuro, e questa è stata la sorte di alcuni degli algoritmi più conosciuti come MD4 o MD5.


Sicurezza informatica: la crittografiaQuello che abbiamo appena detto, però, potrebbe apparire in contraddizione con il principio dei cassetti, ma in realtà non è esattamente così. Una funzione hash dovrebbe essere studiata e creata appositamente per far sì che sia computazionalmente impossibile risalire al testo che ha generato l’hash. Teoricamente sarebbe possibile farlo, ma in un tempo lunghissimo (… la fine dell’universo), il che esclude automaticamente ogni tentativo di brute-force.

Parlando di collisioni, è giunto il momento di fare il nome di alcuni algoritmi di hash comunemente utilizzati e le relative collisioni eventualmente trovate (per un elenco completo, consiglio di dare uno sguardo alla pagina di Wikipedia):

  • MD5: Uno degli algoritmi più diffusi, nonostante ne siano state dimostrate varie vulnerabilità. Il suo uso ancora oggi così diffuso è dovuto sostanzialmente al fatto che è molto veloce da calcolare e che la maggior parte dei sistemi informatici non necessita di una protezione al 100% contro attacchi agli hash; sono altre le vulnerabilità da proteggere e gli accorgimenti da prendere.
  • SHA-1:  Altro algoritmo molto diffuso, più recente (1995) e sicuro di MD5, ma anche per questo algoritmo è stata trovata una collisione. Le sue evoluzioni sono la famiglia SHA-2, che contiene 4 algoritmi diversi, chiamati così in base alla lunghezza del digest: SHA-224, SHA-256, SHA-384, SHA-512. Ma così come la crittografia avanza, la crittoanalisi non si lascia sorprendere così facilmente, e anche la famiglia SHA-2 cade di fronte alle collisioni, nonostante ciò non significhi che questi algoritmi non siano sicuri.
  • SHA-3: La terza versione dello SHA merita una parentesi a parte. Questo nuovissimo algoritmo pubblicato il 2 ottobre 2012, originariamente noto come Keccak, è stato eletto vincitore del NIST hash function competition. Questo algoritmo è così nuovo che non ci sono dati sufficienti per valutarne la sicurezza, ma a quanto pare, avendo vinto questa importante competizione (iniziata nel 2007) deve avere veramente qualcosa di speciale.

Ora, dopo una breve introduzione teorica, è giunto il momento di parlare delle applicazioni degli algoritmi di hash, cioè dove, come e perché vengono usati. Riporto alcuni tra gli esempi più comuni.

 

Esempi di applicazione degli algoritmi di hash

Gli hash, come è facilmente intuibile, hanno un’infinità di campi di applicazione, ma la loro forza è evidente soprattutto in campo informatico e in particolare nella sicurezza dei dati.

 

Controllo degli errori durante le trasmissioni di dati

Software per il controllo dell'integrità dei file grazie agli hashTutti commettiamo degli errori. Anche i PC. Ma loro, a differenza di noi, non possono permetterselo, quindi come facciamo ad assicurarci che non ci siano stati errori nell’invio di una mail, durante un download o nella copia di un file? Come possiamo verificare con certezza che non ci siamo persi nessun byte durante il passaggio di pacchetti o la comunicazione? Ecco che gli hash ci vengono in soccorso.

L’abbiamo già detto, un hash è una sorta di impronta digitale di un file, che cambia drasticamente anche se varia un solo bit del file stesso. Quindi, se gli hash calcolati prima e dopo la trasmissione o il passaggio corrispondono, allora possiamo essere sicuri che la procedura sia andata a buon fine e che il nostro file finale risulta “integro”.

Va bene la teoria, ma chi può aiutarci ad effettuare questo tipo di controllo? Un software! E vai che parte una “marketta” (alla Chiambretti), un po’ di sana pubblicità. Posso consigliarvi di provare il mio software Hasher, che non  è altro che un calcolatore di hash per file, che supporta MD5, SHA-1 e i quattro algoritmi della famiglia SHA-2, è in italiano e naturalmente gratuito. L’ho creato qualche anno fa. Sul sito c’è anche un video-tutorial che ne spiega il già semplice utilizzo. Fine “marketta”.

 

Crittografia

Un campo che pullula di algoritmi di hash è la crittografia. Questa scienza è molto complessa e particolarmente estesa, il che la rende impossibile da approfondire in un unico articolo, ma comunque, mi sembra corretto menzionare almeno qualche esempio di applicazione di hash, anche perché così approfittiamo per chiarire quello che è il rapporto molto stretto tra crittografia ed hash, magari comprendendone le differenze sostanziali.

 

Come vengono memorizzate le password degli account dei siti web?

Sicurezza dati: memorizzare le password tramite gli hashPenso che questa sia una domanda che più o meno ci siamo posti tutti: come può questo tal sito proteggere efficacemente la mia password, e quindi il mio account da intrusioni?

Dando per scontato che tutti sappiamo cosa sia un database, possiamo proseguire dicendo che normalmente le password vengono memorizzate proprio in un database, il quale viene tenuto il più “lontano” possibile dalla rete (e quindi anche da potenziali hacker). Al suo interno troviamo varie tabelle ed una di queste contiene tutte  le informazioni riguardo gli account. Per fare un semplice esempio, consideriamo solo un elenco di coppie username – password.


Username

Password

Foo

mypassword

Bar

mymoresecurepassword

 

Se le password fossero davvero memorizzate in questo modo, ovvero in chiaro (si consiglia denunciare il DBA per “deficienza informatica”), e per un qualunque motivo, un hacker venisse in possesso del database o trovasse un bug per accedervi, avrebbe tranquillamente accesso a tutte le password di tutti gli utenti (aiuto!).

Per ovviare a questo problema si ricorre allora agli hash: non vengono memorizzate direttamente le password in chiaro, ma piuttosto i loro hash.


Username

Password

Foo

91dfd9ddb4198affc5c194cd8ce6d338fde470e2

Bar

5fba5460285313c7c0c46875d1f23b2201d153a6

 

Ma allora come fa il sito a riconoscere che l’utente in fase di login ha inserito la password corretta? La risposta continua ad essere l’hash: il sito web non confronta direttamente la password che noi inseriamo, ma piuttosto confronta se l’hash memorizzato corrisponde con l’hash della password inserita. Quindi se gli hash corrispondono, corrisponderanno anche le password, e l’accesso viene garantito.


Riconoscimento dell'hash della password

 

Perché complicare tutto il processo? Perché così anche se l’hacker riuscisse ad ottenere l’accesso al database, vedrebbe solo ed esclusivamente hash, che non gli permetterebbero di risalire alle password originarie. Ma data la potenziale anche se remota vulnerabilità degli algoritmi di hash, la prudenza non è mai troppa  e allora ecco che introduciamo una nuova difficoltà per chi vuole rubare i nostri dati: il salt (per il DBA di cui sopra questo risulterà tipo ostrogoto antico).

Il salt non è altro che una stringa composta da caratteri casuali che viene hashata insieme alla password originale dell’utente, in modo tale che se anche l’hacker venisse in possesso dell’hash (cosa altamente improbabile ma comunque teoricamente possibile) dovrebbe indovinare sia l’hash che il salt.


Username

Password

Foo

844a1cd9795a62e2b49180487987bfee68f42675

Bar

c79e0b66f0efecc09e03330085ce9f9e3d4c3516

 

Quindi, nel database (quello serio, non quello del DBA di cui sempre sopra), gli hash memorizzati vengono ad essere il risultato della combinazione fra salt e password. Ad esempio, possiamo considerare come salt la stringa [897j+èà.-+ì'("/)$!£] e inserirla dopo il secondo carattere della password (in realtà i salt sono molto più lunghi e complicati e i metodi di unione con la password vanno ben oltre il semplice inserimento).

SHA-1(my[897j+èà.-+ì'("/)$!£]password) = 844a1cd9795a62e2b49180487987bfee68f42675

SHA-1(my[897j+èà.-+ì'("/)$!£]moresecurepassword) = c79e0b66f0efecc09e03330085ce9f9e3d4c3516

Insomma, vengono presi tutta una serie di accorgimenti affinché il lavoro dell’hacker venga reso il più difficile possibile: trovare la password, trovare il salt, scoprire come salt e password vengono uniti e scoprire quale algoritmo di hash è stato utilizzato (negli esempi precedenti abbiamo sempre utilizzato SHA-1).


Nota al margine. Diffidare da siti e/o applicazione web che:

  • comunicano la password in chiaro tramite mail
  • permettono il recupero della stessa password originale che avete perso
  • al cambio della password verificano che la nuova password sia stata già stata utilizzata

La regola d’oro è che l’amministratore non deve conoscere MAI la vostra password perché, per quanto sia una persona seria ed onesta, per quanto non rivelerebbe mai la vostra password neanche sotto tortura, se lui la conosce prima o poi può arrivare a saperla anche un hacker malintenzionato (capito DBA di cui sopra-sopra?).


La firma digitale

Un altro esempio di applicazione pratica degli hash è rappresentato dalla cosiddetta firma digitale. Qui le cose si iniziano a fare un po’ più complesse ma è l’occasione perfetta per vedere in concreto come hash e cifratura di un documento siano due cose distinte che al contempo, coesistendo, rendono il livello di sicurezza dei dati ancora più elevato.

Per approfondimenti rimando a questa ottima guida illustrata, ma in sintesi il processo può essere schematizzato così:


Funzionamento della firma digitale 

Alice vuole inviare un documento a Bob, il quale vorrebbe essere sicuro che sia stato effettivamente scritto da Alice e che non sia stato alterato durante il trasferimento. Come risolvere quindi questi problemi?

Due problemi, due soluzioni:

  • L’integrità del documento durante la trasmissione. Ormai penso che la risposta/soluzione sia abbastanza ovvia: hash.
  • L’autenticazione sicura del mittente. Qui invece entriamo in un altro campo, che è quello della crittografia asimmetrica.
    In pratica, Alice ha due chiavi di cifratura che non possono essere ricavate una dall’altra (grazie alla potenza dei numeri primi ed in particolare del processo di fattorizzazione), una delle quali la tiene stretta per sé (chiamata appunto chiave privata), mentre l’altra può essere tranquillamente lasciata accessibile a tutti (chiave pubblica). La peculiarità di queste due chiavi è che entrambe permettono di cifrare un messaggio e solo la corrispondente chiave può decifrarlo. Ora vedremo proprio come vengono utilizzate queste chiavi.

Tornando ai nostri Alice e Bob, Alice prima di mandare il documento a Bob ne calcola l’hash e cifra l’hash con la sua chiave privata. Il risultato di questa operazione è la firma digitale (rappresentata in figura dal gagliardetto), che viene aggiunta alla fine del documento. Fatto ciò, Alice spedisce a Bob il documento con allegata la firma.

Quando Bob riceve il documento, estrae la firma e la decifra con la chiave pubblica di Alice. Se l’operazione di decifratura è riuscita, allora ci siamo assicurati che il documento è stato davvero scritto da Alice, dato che solo lei possiede la corrispondente chiave privata in grado di cifrare il messaggio. Contemporaneamente Bob calcola l’hash del documento ricevuto e lo confronta con quello appena decifrato. Se corrispondono, allora significa che il documento è anche integro, oltre che autentico.


Questo sistema sarebbe perfetto se non per una piccola falla in fase di scambio delle chiavi pubbliche. Come fa Bob ad assicurarsi che la chiave pubblica che riceve da Alice sia davvero la sua, e che non sia stata forgiata ad hoc da Eve, sotto falso nome di Alice?

Ecco qui che la trama si complica: Eve, la nostra intrusa di turno, interessata a intromettersi nella conversazione fra Alice e Bob, fa sì che Alice riceva un’altra chiave pubblica (sotto falso nome di Bob). Come può Alice accertarsi che la chiave che ha ricevuto sia autentica?

Certificato per la firma digitaleCaso vuole che entri nella nostra storia Susan, che lavora presso l’autorità di certificazione digitale. Susan ha l’autorità di emettere un certificato digitale con una serie di informazioni pubbliche su Bob, tra le quali anche la sua chiave pubblica. Quindi, quando Alice riceve la chiave pubblica di Bob, prima di accettarla, la confronta con quella registrata da Susan. Ma il controllo di Alice è molto più approfondito; controlla anche che Bob sia del tutto in regola con il certificato di Susan.


I certificati hanno delle scadenze e devono essere rinnovati, oppure possono essere revocati da Susan per una serie di ragioni di sicurezza (forse perché ha scoperto che in realtà Bob è un criminale?). Questo conferisce a Susan un enorme potere, perché è lei che decide di chi ci si può fidare, ma chi ci assicura che ci possiamo fidare della stessa Susan? Susan non è entrata a far parte dell’autorità di certificazione digitale perché ha vinto un semplice concorso, no, per giunta anche lei è stata approvata come affidabile da altre autorità di certificazioni più grandi e sicure, che sono state a loro volta certificate da altrettante autorità, e così via.


Nota al margine:
comunicando tra loro Alice e Bob non fanno niente di più che inviarsi delle semplici mail che però, essendo certificate, mettono in moto tutti i vari passaggi di sicurezza di cui abbiamo parlato, passaggi di cui Alice e Bob non devono farsi personalmente carico perché è il sistema della firma digitale a provvedere a tutto.

 

Intromissione

HakerLUI –Quante belle chiacchiere. Bla, bla, bla…. E dove è la Matematica? Nell’articolo non ho visto un numero, un operatore, un’equazione, una funzione… Nisba! Niente di niente. Il titolo dell’articolo è falso e fuorviante. La matematica è completamente assente.

IO – “Caro LUI, la tua idea di Matematica è un tantino riduttiva se pensi che si manifesti solo come hai imparato a conoscerla alle elementari. Ma tranquillo, non sei solo nella tua ignoranza (senza offesa chiaramente, ignoranza nel senso di ignorare, non conoscere). In molti non vedono la matematica anche quando questa è assolutamente e prepotentemente presente nella natura e negli oggetti della nostra quotidianità. Nel caso dell’informatica, con un po’ di sforzo puoi riuscire a scovarla, ma non ci sarebbe bisogno di scomodare esempi così eclatanti, basterebbe che tu, ad esempio, guardassi alla tecnologia che ti circonda con un occhio un tantino più attento. Se qualcuno ti avesse insegnato ad osservare, ora vedresti

 

 

PS:
Solo per dire che LUI è un hacker che si è infiltrato; ho lasciato qualche porta aperta ed è entrato. Non credo però possa fare molta strada come hacker vista la sua idea “ristretta” di Matematica.

PPS:
La cavolata dell’hacker è un modo per giustificare la totale assenza di formule all’interno dell’articolo. E’ stata una scelta ponderata. Qualcuno che ne sa molto più di me in fatto di comunicazione, asserisce che statisticamente l’inserimento di formule all’interno di un articolo di divulgazione tende ad abbassare notevolmente l’interesse ed il coinvolgimento. E io mi son fidato. Anche se però continuo a chiedermi come mai un lettore, consapevole che sta leggendo un articolo sulla matematica, alla vista delle formule dovrebbe scappare. Sarà che questa benedetta matematica davvero in pochi la comprendono? Sarà che a questo bisognerebbe porre rimedio? Sarà che forse, proprio per questo, la cara vecchia signora rugosa è così restia a manifestarsi apertamente?  

 

 Marco Cameriero


Ti consiglio di seguire commenti ed eventuali discussioni
sulla pagina di Matem@ticamente che ha ospitato l'articolo
   
Codice per incorporare l'articolo
     
Non hai trovato quello che cercavi?
Torna alla HomePage, da lì potrai accedere facilmente a tutti i contenuti del sito.
Torna all'inizio
Tutti i webmaster che volessero segnalare, non copiare,
il contenuto di questa pagina sul proprio sito, possono farlo liberamente.
E' gradito un preavviso tramite mail all'autore e l'iserimento,
nella pagina di citazione, di un link verso la pagina corrente.
© Copyright    Marco's Room
Contatti    Privacy    Valid XHTML 1.0 Transitional    CSS Valido!
Marco Cameriero Segui su LinkedInLinkedIn
Segui su Google+Google+
Data di pubblicazione: 15/10/2009    Ultimo aggiornamento: 01/12/2013
 
Porta d'ingresso per Marco's Room, la stanza Marco
  Feed RSS
Google
Web   Marco's Room
 
Effettua il login oppure registrati