Introduzione

In questo articolo diamo un’occhiata ad alcuni elementi teorici e pratici inerenti quella che viene di solito indicata come la terza via della crittografia. Questo paradigma si distingue sia dai cifrari simmetrici, in cui si utilizza una sola chiave di cifratura/decifratura, sia dai cifrari asimmetrici, in cui si adoperano 2 chiavi di cifratura/decifratura, come visto negli articoli precedenti⁠. La crittografia senza chiave si basa sull’uso di funzioni hash, particolari funzioni in grado di elaborare speciali codici con proprietà interessanti che, come vedremo, sono utili in molti contesti e che, probabilmente, adoperi già nella tua pratica quotidiana. Scopriamo cosa sono.

Cosa sono le funzioni hash?

La crittografia senza chiave si basa sull’uso delle funzioni hash con cui è possibile creare un codice di lunghezza fissa a partire da un testo di lunghezza arbitraria.

Una delle caratteristiche fondamentali di queste funzioni è di essere in grado di “riconoscere” anche una piccolissima variazione nel testo di origine, per quanto questo sia grande e per quanto sia piccola la variazione, e di generare un codice totalmente differente come risultato.

L’altra caratteristica fondamentale delle funzioni di hashing è quella di essere “molto difficili da invertire” nel senso che, disponendo del codice risultato risulta essere computazionalmente molto complesso generare un testo di input in grado di determinare come risultato proprio quel codice.

Semplificando molto, proprio queste due caratteristiche, messe assieme, distinguono le funzioni hash decretandone utilità nel campo della cybersecurity.

Prima di definire meglio e fare alcuni esempi concreti di funzioni di hashing, vediamo come si adoperano e quindi a cosa servono.

A cosa servono le funzioni hash?

Le funzioni hash, proprio in base alle due caratteristiche appena descritte, sono in grado di offrire una soluzione efficace per il riconoscimento dell’integrità dei messaggi ma non offrono riparo per la confidenzialità delle comunicazioni.

Ecco un esempio d’uso pratico delle funzioni di hash: la verifica di manomissione del contenuto di un messaggio.

Esempio: firma digitale del codice hash come prova di integrità.

Immagina i due classici interlocutori, Alice e Bob, che si scambiano un messaggio. Alice invia un messaggio a Bob e quest’ultimo vorrebbe avere la certezza che il messaggio pervenuto non sia stato sostituito da un altro durante il percorso fatto per raggiungerlo. Utilizzando le funzioni hash, Alice può allegare al messaggio un codice risultato dell’applicazione della funzione hash al messaggio originale. Su questo codice Alice applica la cifratura asimmetrica adoperando la sua chiave privata: questa è la firma digitale di Alice eseguita sul proprio messaggio. Alice può inviare quindi a Bob sia il messaggio originale in chiaro che la sua firma digitale così ottenuta.

All’arrivo del messaggio, Bob decifra la firma di Alice applicando la cifratura asimmetrica con la chiave pubblica di Alice ed ottiene l’hash originario che solo Alice potrebbe aver generato e poi genera l’hash del messaggio intero, ricevuto in chiaro. Se i due codici hash così ottenuti corrispondono allora Bob ha la prova che il messaggio non è stato modificato durante il tragitto ed è quindi integro rispetto a quanto inviato da Alice. Nello schema grafico che segue puoi vedere  i singoli passaggi più chiaramente.

firma digitale: esempio diagramma di interazione

Diagramma di interazione: firma digitale di un messaggio come prova integrità

Nel diagramma precedente con il simbolo = si intende l’assegnamento di stato delle variabili mentre con == si indica l’eguaglianza. Con PrivA e PubA si indica, rispettivamente, l’applicazione della funzione di crittografia asimmetrica con l’uso della chiave privata di Alice e pubblica di Alice.

Sebbene sia teoricamente possibile applicare direttamente la crittografia PrivA al messaggio originale M inviando la coppia <M,M’> comprova di integrità e di origine, in realtà sarebbe calcolare un valore hash del messaggio M riduce notevolmente i tempi di generazione ed invio della firma digitale poiché il codice hash è normalmente, notevolmente più piccolo e più facile da generare e cifrare.

Andiamo al cuore del tema riprendendo alcuni elementi matematici.

Approfondiamo ora la matematica che è dietro le funzioni hash ma, se preferisci, puoi saltare al paragrafo successivo per vedere subito alcuni tool che, tra le altre cose, adoperano le funzioni di hash per assicurare l’integrità dei messaggi eMail.

Abbiamo detto che le funzioni hash sono una funzioni iniettive non invertibili che associano, ad una stringa di lunghezza arbitraria, una stringa di lunghezza fissa detta codice hashing della stringa originale. In crittografia, le funzioni hash, a differenza degli usi che ne vengono fatti nei sistemi database, devono soddisfare anche le seguenti proprietà:

  • resistenza alla preimmagine: deve risultare molto complesso, dal punto di vista computazionale, ricercare una stringa in input che dia un hash uguale ad un dato hash;
  • resistenza alla seconda preimmagine: deve risultare molto complesso, dal punto di vista computazionale, ricercare una stringa in input che dia un hash uguale a quello di una data stringa;
  • resistenza alle collisioni: deve risultare molto complesso, dal punto di vista computazionale, ricercare di una coppia di stringhe in input che diano lo stesso hash.

Sebbene possano sembrare simili, le precedenti proprietà, definiscono delle condizioni differenti che, messe assieme, denotano una funzione hash “solida”.  Gli algoritmi che calcolano funzioni hash sono detti algoritmi di hash e, nel tempo, ne sono stati definiti molti e molti di essi sono stati ‘attaccati’ per verificare la loro solidità. Si tratta quindi di verificare quanto difficile sia  riuscire a generare le cosiddette “collisioni”, ossia ricavare due stringhe che diano lo stesso codice hash risultato, contraddicendo la terza delle precedenti proprietà, la più delicata delle tre, mettendo così a rischio la prova di integrità dei messaggi. In passato alcuni algoritmi di hash famosi sono stati dismessi e sconsigliati dall’essere adoperati proprio per questo motivo. Ricordiamo ad esempio gli algoritmi SNEFRU, MD2, MD4 ed MD5.

Quest’ultimo, l’MD5, progettato nel 1991 da Ronald Rivest dell’MIT, per molti anni è stato ritenuto sicuro ma, già dal 2006, esiste un algoritmo in grado di trovare una collisione in un minuto adoperando un singolo computer con un metodo che il suo ideatore, Vlastimil Klima, definì tunnelling.

Ad oggi si consiglia, tra gli altri, l’uso degli algoritmi appartenenti alla famiglia SHA, Secure Hash Algorithm. Si tratta di 5 diversi algoritmi di hash sviluppati dal 1993 dalla NSA e pubblicati dal NIST come standard in USA (rif. https://csrc.nist.gov/csrc/media/publications/fips/180/4/final/documents/fips180-4-draft-aug2014.pdf).

Il primo di questi algoritmi, detto SHA-1, è stato già compromesso dai crittoanalisti per cui oggi si consiglia l’uso delle varianti, più robuste, SHA-2 e successive. Nel 2007 venne indetto una competizione pubblica per la definizione dell’algoritmo SHA-3 che venne vinta da un team composto da analisti italiani e belgi con l’algoritmo Keccak (https://keccak.team/index.html).

Mentre di SHA-0 e SHA-1 esistono singoli algoritmi che producono come risultato codici di 160 bit, di SHA-2 esistono 4 varianti che producono rispettivamente codici con 224, 256, 384 e 512 bit di lunghezza come risultato.

Per esemplificare il funzionamento interno delle SHA-2, riportiamo un esempio di procedura che viene applicata ad ogni singolo passo a ciascun blocchetto di 256 bit in cui viene suddiviso il messaggio originario. In seguito ad una fase di inizializzazione dei primi 8 blocchetti (da A ad H) da 32 bit l’uno, si eseguono le operazioni di AND, OR e XOR (più operazioni logiche annidate denotate con i blocchetti Ch e Ma in figura) con successivo ri-posizionamento dei risultati che sono così pronti per essere riutilizzati nell’iterazione successiva, scorrendo via via il messaggio originario.

sha-2 schema singolo passo algoritmo

Schema del singolo passo dell’algoritmo SHA-2 256

Attualmente la famiglia SHA-2 è ritenuta sicura ed una sua variante è utilizzata anche in blockchain, come vedremo in un prossimo articolo, allo scopo di collegare i blocchi con l’uso dei puntatori hash.

Alcuni tool semplici ed utili

Ritorniamo adesso al caso della firma digitale per la verifica di integrità dei messaggi. Sebbene questi passaggi possano sembrare ‘ingombranti’ esistono dei tool, anche opensource e gratuiti che, integrati nel proprio client di posta elettronica, eseguono queste operazioni in modo istantaneo e trasparente. Basta installare i plugin giusti e provare a firmare le email in uscita ed iniziare a verificare l’integrità dei messaggi in arrivo dotati di firma digitale.

Un esempio è la suite basata sul software di crittografia per autenticazione e privacy PGP, Pretty Good Privacy, da cui è derivato lo standard OpenPGP.

Per i sistemi Mac OS X cito la GPG Suite, rif. https://gpgtools.org, che contiene vari tool utili. Ecco un elenco e di seguito alcune schermate dei tool che ne fanno parte:

  • GPGMail: un plugin open source per Apple Mail. Cifra, decifra, firma e verifica l’integrità delle email usando OpenPGP con pochi click.
  • GPGKeychain: un’applicazione open source che consente la gestione semplificata delle chiavi OpenPGP.
  • GPG Services: servizi di integrazione che consentono di lavorare su testi o file, cifrando/decifrando con pochi click.
  • MacGPG: il sotto-sistema con accesso da terminale di comando della GPG Suite che riprendono esattamente i comandi GnuPG.

invio e ricezione di messaggi email firmati e cifrati

Schermate che illustrano email firmate e cifrate in invio, a sinistra, e in ricezione, a destra, nell’applicazione Mail di Apple con add-on della GPG Suite.

Come è possibile intuire dalle stesse immagini, l’uso di questi tool è davvero immediato. Sei interessato ad un video tutorial che illustra l’uso approfondito dell’ultima versione di questi tool? Per farmelo sapere puoi scrivermi alla mia email personale dario.carotenuto at gmail.com  o commentando quest’articolo.

Per sistemi Windows, Linux ma anche per Mac, cito invece Enigmail (rif. https://www.enigmail.net): un plugin che si integra nel client di posta multipiattaforma Mozilla Thunderbird aggiungendo le funzionalità di sicurezza. Enigmail consente di adoperare facilmente le funzioni OpenPGP per cifrare/decifrare e firmare digitalmente e verificare l’integrità delle email in arrivo. Enigmail è sofware libero distribuito con licenza Mozilla Public License (rif. https://www.mozilla.org/en-US/MPL/2.0/).

enigmail schermata d'esempio

Enigmail: schermata d’esempio

I certificati digitali

Ora che abbiamo trattato sia la firma digitale che i codici hash possiamo fare un ulteriore passo introducendo i certificati digitali.

I certificati digitali consentono di collegare chiavi pubbliche a determinati individui consentendo di adoperare queste chiavi per inviare messaggi confidenziali, che si è visto in un precedente articolo (rif. Crittografia simmetrica) con un elevato grado di fiducia.

Come sono fatti i certificati digitali?

Semplicemente corrispondono a pacchetti che includono la chiave pubblica ed dati identificativi di una persona, come può essere un account email, nome, cognome, il tutto firmato da un’Autorità di Certificazione nota e sicura, la cosiddetta CA, Certificati Authority.

La CA è un’entità fidata che gestisce un database pubblico di certificati digitali. Una tra le tante CA note è ad esempio VeriSign (rif. http://www.verisign.com) oppure il dipartimento della difesa statunitense, DoD. In questo modo, disponendo della sola chiave pubblica, sicura, della CA è possibile ’certificare’ che la chiave pubblica che si sta usando per inviare un messaggio confidenziale a una persone sia effettivamente di quella persona.

La CA è solo una parte dell’infrastruttura che serve per gestire certificati digitali su larga scala, anche detta PKI, Public Key Infrastructure. L’altra componente della PKI è costituita dalle Registration Authority, RA, il cui compito è verificare l’identità degli individui associati ai certificati.

Conclusioni

In quest’articolo abbiamo introdotto alcuni elementi di teoria e di pratica alla base della crittografia senza chiave che fa leva sulle funzioni hash, sul loro uso per la generazione e la verifica di firme e l’utilizzo dei certificati digitali.  Abbiamo anche visto come oggi sia possibile gestire il modello delle firme digitali e dei certificati digitali attraverso una Public Key Infrastructure basata su Certification Authority e Registration Authority. Anche se tutte queste tecniche possono sembrare molto robuste dal punto di vista teorico, nella pratica quotidiana il vero tallone d’Achille è rappresentato dagli end-points, ossia i punti terminali delle comunicazioni. Si tratta dell’uso dei dispositivi che adoperiamo tutti i giorni. Molta parte della nostra  sicurezza online passa attraverso l’uso corretto e consapevole dei nostri dispositivi personali. Comprendendo meglio la teoria e padroneggiando la pratica saremo sicuramente in vantaggio rispetto alle minacce alla nostra sicurezza online.

Nei prossimi articoli torneremo sull’argomento e, intanto, spero che questa panoramica del tema ti sia piaciuto. Come sempre, ti ringrazio e ti invito a farmi sapere cosa ne pensi. A presto!