Bibliografia:
Computer Networking. Autori: James F. Kurose (University of Massachusetts, Amherst) Keith W. Ross (Polytechnic Institute of NYU).

Integrità dei dati e Firma digitale

Introduzione

La criptografia soddisfa il requisito della segretezza dei dati riservati, ma consente di soddisfare anche gli altri requisiti di una comunicazione sicura.

Per impostare il problema dell'integrità dei messaggi, si supponga che Bob riceva un messaggio (criptato o in chiaro) che ritiene spedito da Alice. Per autenticare questo messaggio, Bob deve verificare che:

  1. Il messaggio sia stato realmente originato da Alice.

  2. Il messagio non abbia subito manomissioni lungo il percorso per giungere a Bob.

Il problema dell'integrità dei dati riguarda anche la sicurezza dei protocolli di rete.

Come esempio specifico, si consideri una rete di calcolatori che usa l'algoritmo di tipo link-state (come OSPF) per calcolare gli instradamenti di costo minimo tra qualsiasi coppia di router nella rete. In un algoritmo di tipo link-state, ogni router invia in broadcast un messaggio di link-state a tutti gli altri router della rete. Un messaggio di link-state di un router contiene una lista dei router adiacenti e dei relativi costi delle linee. Dopo che un router ha ricevuto i messaggi di link-state dagli altri router, può creare una mappa completa della rete, eseguire l'algoritmo di calcolo dei cammini di costo minimo e costruire la tabella di instradamento. L'algoritmo di routing è facilmente attaccabile. Un intruso, infatti, può diffondere falsi messaggi di link-state, nei quali, cioè, sono indicati instradamenti sbagliati. Da questo rischio nasce il requisito di garantire l'integrità dei messaggi: quando il router B riceve un messaggio di link-tate dal router A, il router B dovrebbe verificare che il messaggio è stato realmente spedito da A e che, inoltre, il messaggio non è stato contraffatto durante la comunicazione.

Funzioni HASH

Una funzione hash riceve un ingresso m e calcola una stringa di lunghezza fissa H(m) nota come hash. Il checksum e il CRC, usati per il controllo degli errori, soddisfano questa definizione, ma ad una funzione hash sono richieste ulteriori proprietà:

deve essere estremamente difficile riuscire a trovare due messaggi diversi x e y tale che H(x) = H(y).

Lo scopo di questo requisito è che un intruso non deve riuscire a sostituire un messaggio con un alrto. Cioè, se (m, H(m)) sono il messaggio e l'hash del messaggio creato dal mittente, allora l'intruso non può costruire un altro messaggio, y, che ha lo stesso valore hash del messaggio originale.

Un semplice checksum rappresenterebbe una funzione hash insoddisfacente. Anzichè eseguire l'aritmetica in complemento a 1, si calcoli il checksum considerando ogni carattere come un byte e si sommino i byte a gruppi di 4. Se Bob deve restituire ad Alice 100.99 euro, e le manda un bonifico in cui scrive la stringa di testo "EUR100.99BOB". La rappresentazione in codice ASCII (in notazione esadecimale) di queste lettere è 45, 55, 52, 31, 30, 30, 2E, 39, 39, 42, 4F, 42.

La figura seguente mostra che il checksum di 4 byte per questo messaggio è AE C1 D2 AC.

Messaggio: Rappresentazione
ASCII:
EUR1 45555231
00.9 30302E39
9BOB 39424F42
 checksum:AEC7CFAC

Un messaggio leggermente diverso, ma molto più costoso per Bob, è proposto nella figura seguente. I messaggi EUR100.99BOB e EUR900.19BOB hanno lo stesso checksum. Quindi questo semplice algoritmo non soddisfa il requisito stabilito prima. È molto facile trovare un messaggio diverso da quello originale che fornisce lo stesso checksum.

Messaggio: Rappresentazione
ASCII:
EUR9 45555239
00.1 30302E31
9BOB 39424F42
 checksum:AEC7CFAC

Per aumenatre il grado di sicurezza si deve trovare una funzione hash più potente.

L'algoritmo MD5 è molto usato. Calcola un hash di 128 bit in un processo a quattro fasi consistente di un passo di riempimento (cioè aggiungere un 1 seguito da tanti 0 fino a che la lunghezza del messaggio soddisfi certe condizioni), un passo di accodamento (accodamento di 64 bit che rappresentano l'informazione relativa alla lunghezza del messaggio originario), L'inizializzazione di una variabile e un ciclo in cui i blocchi di 16 word sono elaborati. Nel web è disponibile l'algoritmo e il programma, in vari linguaggi, che implementano MD5.

Un'altra diffusa funzione hash ampiamente usata è Secure Hash Algorithm (SHA-1). Questo algoritmo si basa su principi simili a quelli usati nel progetto dell'MD4, il predecessore di MD5. SHA-1 produce un riassunto del messaggio di 160 bit. Quanto maggiore è la lunghezza dell'output della funzione hash, tanto più SHA-1 è sicuro.

Message Authentication Code

Dopo aver esaminato le funzioni hash, si può adesso provare a trovare un meccanismo per controllare l'integrità dei messaggi.

  1. Alice crea un messaggio m e calcola l'hash H(m) (ad esempio con SHA-1).

  2. Alice aggiunge H(m) in coda al messaggio m, creando un messaggio esteso (m, H(m)), e trasmette il messaggio esteso a Bob.

  3. Bob riceve un messaggio esteso (m, h) e calcola H(m). Se H(m) = h, Bob conclude che il messaggio non è stato modificato.

L'intruso non ha difficoltà a creare un messaggio falso, m', nel quale dichiara di essere Alice, calcola H(m'), e trasmette a Bob (m', H(m')). Quando Bob riceve il messaggio, eseguendo i calcoli di controllo, non sospetta nessun inganno.

Per verificare l'integrità, oltre alla funzione hash, Alice e Bob hanno bisogno di una chiave segreta condivisa s. Questa chiave segreta condivisa, che è una semplice stringa di bit, è chiamata chiave di autenticazione. Usando questa chiave segreta condivisa, l'integrità del messaggio può essere verificata come segue:

  1. Alice crea il messaggio m, concatena s ed m per creare m + s, e calcola l'hash H(m + s) (ad esempio con SHA-1). H(m + s) è chiamato il codice di autenticazione del messaggio (Message Authentication Code - MAC).

  2. Alice aggiunge il MAC in coda al messaggio m, creando un messaggio esteso (m, H(m + s)), e trasmette il messaggio esteso a Bob.

  3. Bob riceve il messaggio esteso (m, h) e conoscendo s, calcola il MAC H(m + s). Se H(m + s) = h, Bob conclude che il messaggio non è stato alterato.

In alcuni casi, come l'algoritmo di instradamento di tipo link-state, non si è interessati alla riservatessa del messaggio, ma solo all'integrità dei dati. Usando un MAC, senza ricorrere a complicati calcoli di criptografia per renderli illeggibili, le entità possono verificare che i dati non sono stati alterati lungo il cammino. Sono stati proposti numerosi standard per il calcolo del MAC, il più diffuso è l'HMAC (Hashed-key Message Authentication Code), che può essere usato con MD5 o SHA-1. HMAC elabora i dati e la chiave di autenticazione tramite la funzione hash. Resta da risolvere il problema della distribuzione della chiave di autenticazione. Ad esempio, nel caso dei massaggi scambiati tra i router relativi all'algoritmo di instradamento, qualcuno dovrebbe farsi carico di inserire la stessa chiave segreta di autenticazione in tutti i router del sistema autonomo. L'amministratore lo potrebbe fare recandosi presso ciascun router, oppure se ogni router possiede una chiave pubblica, l'amministratore può criptarla con la chiave pubblica e spedirla, attraverso la rete, ai router.

Firma digitale

La firma apposta a un documento attesta il fatto che si è letto o, comunque, si approva il contenuto del documento. Nel mondo dei computer, la firma digitale è la tecnica criptografica per affermare la proprietà di un documento, o la conoscenza del suo contenuto.

Come la firma manuale, anche la firma digitale deve essere riconducibile ad una persona, cioè deve essere verificabile e non falsificabile. Deve essere possibile provare che la firma apposta ad un documento corrisponde realmente alla firma dell'autore del documento (verificabile) e che solo quella persona può aver firmato il documento (non ripudio, l'autore non può negare di aver firmato).

Adesso si provi a immaginare il processo che produce una firma digitale. Quando Bob firma un messaggio, Bob deve inserire nel messaggio qualcosa che lo identifica univocamente. Bob potrebbe pensare di allegare un MAC come firma, concatenando la propria chiave privata al messaggio e calcolando l'hash della concatenazione. Ma affichè Alice possa verificare la firma dovrebbe possedere una copia della chiave, che in questo modo non sarebbe più posseduta solo da Bob. Quindi il MAC non è adatto per apporre la firma digitale ad un documento.

Si ricordi che, nella criptografia a chiave pubblica, Bob possiede una chiave pubblica ed una chiave privata. Questa coppia di chiavi appartengono solo a Bob. Quindi la criptografia a chiave asimmetrica consente di soddisfare i requisiti di una firma digitale.

Si supponga che Bob voglia firmare digitalmente un documento m. Per firmare questo documento, Bob calcola, con la sua chiave privata, KB-(m), Potrebbe sembrare sbagliato che Bob usi la sua chiave privata, perchè, per garantire la segretezza del messaggio, questa chiave serve per decriptare, non per criptare. Ma si ricordi che la criptografia e la decriptografia sono operazioni matematiche (il calcolo della potenza di un numero) e che lo scopo di Bob non è quello di mascherare e rendere incomprensibile il contenuto del documento, ma di firmare il documento, consentendo la verificabilità e la non falsificazione della firma. Quindi la firma digitale di Bob è KB-(m).

Ci si chiede se questa firma digitale è verificabile e non falsificabile. Si supponga che Alice ha m and KB-(m). Vuole provare in tribunale che Bob è il vero autore del messaggio. Alice, conoscendo la chiave pubblica di Bob, KB+, e prelevando la firma digitale KB-(m) dal documento m, calcola KB+(KB-(m)), e, come risultato, ottiene m, che corrisponde esattamente al documento originale. Alice può asserire con certezza che solo Bob può aver firmato il documento, per le seguenti ragioni:

È importante notare che se il documento originale, m, viene modificato in una forma m', la firma che Bob ha creato per m non sarà valida per m', perchè KB+(KB-(m)) non produce m' come risultato. Questo prova che la firma digitale garantisce anche l'integrità dei dati, che consente al ricevitore di verificare che il messaggio è uguale a quello originale.

Il problema di firmare i dati con la chiave privata è che le operazioni di criptografia e decriptografia sono lente, quindi per documenti molto grandi si potrebbe notare un indesiderato tempo di calcolo. Un metodo più efficiente consiste nell'impiego delle funzioni hash. Si ricordi che una funzione hash, applicata ad una stringa di lunghezza arbitraria, produce una impronta del messaggio, che si indica con H(m). Quindi Bob può firmare l'hash del messaggio, piuttosto che il messaggio completo. Cioè Bob calcola KB-(H(m)). Poichè la lunghezza di H(m) è, in generale, molto più piccola della lunghezza del messaggio originale m, il tempo di calcolo per generare la firma digitale si riduce.

Riepilogando, quando Bob invia un messaggio ad Alice e crea la firma digitale, Bob calcola l'hash del messaggio completo, poi firma digitalmente l'hash (l'impronta del messaggio) ottenuto con la sua chiave privata. Il messaggio originale (in chiaro) insieme alla firma digitale (ovvero l'impronta del messaggio criptata con la chiave privata) viene trasmesso ad Alice. Quando Alice riceve il messaggio, applica la chiave pubblica del mittente all'hash criptato del messaggio per ottenere l'hash del messaggio. Alice calcola l'hash del messaggio in chiaro. Se i due hash sono uguali, Alice è sicura dell'integrità del messaggio e dell'autenticità dell'autore.

La firma digitale e il MAC hanno alcune caratteristiche in comune, ma anche alcune importanti differenze. Sia la firma digitale, sia il MAC hanno un documento di origine. Per creare il MAC del messaggio, si calcola l'hash della concatenazione del messaggio con una chiave di autenticazione. Il MAC non usa né la criptografia a chiave segreta, né la criptografia a chiave pubblica. Per creare una firma digitale, si calcola prima l'hash del messaggio, poi si cripta il risultato con la chiave privata. Quindi la firma digitale è una tecnica più costosa, perchè richiede che esista una infrastruttura (Public Key Infrastructure: PKI) in cui sono depositate le chiavi, gestita da una autorità di certificazione.

Public Key Certification

Un'importante applicazione della firma digitale è la certificazione della chiave pubblica, cioè l'attestazione che una chiave pubblica appartiene ad una certa entità. La certificazione della chiave pubblica è usata nei protocolli di rete sicuri: IPsec e SSL.

Per fornire un esempio applicativo, si pensi ad una applicazione di e-commerce. Si immagini che Alice gestisca una pizzeria con consegna a domicilio. Alice accetta ordini su Internet. Bob invia un messaggio in chiaro ad Alice nel quale specifica il suo indirizzo di casa e il tipo di pizza che ordina. Alla fine del messaggio Bob inserisce la firma digitale (cioè firma l'hash del messaggio in chiaro), per provare ad Alice che è il vero autore del messaggio. Per verificare la firma, Alice ottiene la chiave pubblica di Bob (ad esempio da un server di chiavi pubbliche o attraverso una e-mail separata) e controlla la firma digitale. In questo modo si assicura che solo Bob può averle inviato il messaggio.

Un intruso invia un messaggio ad Alice in cui si spaccia per Bob, fornisce l'indirizzo di casa di Bob e ordina una pizza. In questo messaggio, l'intruso usa la propria chiave pubblica, che Alice crede appartenere a Bob. L'intruso aggiunge la firma digitale, che ha creato con la propria chiave privata. Quando Alice riceve il messaggio, applica la chiave pubblica dell'intruso (credendo che sia quella di Bob) alla firma digitale e si assicura che il messaggio originale è stato realmente originato da Bob. Bob resterà sorpreso quando si vede consegnare una pizza che non ha ordinato.

Da questo esempio si deduce che, affinchè la criptografia a chiave pubblica sia utile, si deve riuscire a verificare che la chiave pubblica che si usa appartenga realmente all'entità (persona, router, browser, ecc.) con cui si intende comunicare. Ad esempio, quando Alice vuole comunicare con Bob usando la criptografia a chiave pubblica, ha bisogno di verificare che la chiave pubblica che lei suppone che appartenga a Bob sia realmente di Bob.

L'associazione tra la chiave pubblica ed un particolare soggetto viene fatta da una Autorità di certificazione (CA), che ha il compito di attestare le identità e rilasciare i certificati. Una CA ha i seguenti compiti:

  1. verifica che un soggetto (una persona, un router, ecc.) è realmente chi asserisce di essere. Non esistono procedure obbligatorie da rispettare, sul modo in cui avviene la certificazione. Quando si interagice con una CA, ci si deve fidare che questa abbia eseguito rigorosamente gli opportuni controlli per verificare l'identità del soggetto. Ad esempio se un intruso dichiarasse ad una presunta autorità di certificazione una falsa identità e otterrebbe il certificato, non si dovrebbe avere fiducia nei certificati rilasciati da tale autorità. In pratica ci si può fidare dell'identità della persona associata alla chiave pubblica, nella stessa misura in cui ci si può fidare dell'autorità di certificazione e delle procedure che questa adotta per verificare le identià.

  2. Dopo che l'autorità di certificazione verifica l'identità del soggetto, crea un certificato che lega la chiave pubblica del soggetto alla sua identità. Il certificato contiene la chiave pubblica e altre informazioni che servono ad identificare univocamente il proprietario della chiave pubblica. (ad esempio il nome o l'indirizzo IP). Il certificato è firmato digitalmente dall'autorità di certificazione.

In che modo l'uso del certificato impedisce di falsificare un messaggio? Ritornando all'esempio dell'ordine di una pizza su un sito e-commerce, Bob insieme alla compilazione del modulo di ordine, invia anche il suo certificato garantito dalla CA. Alice usa la chiave pubblica della CA per controllare la validità del certificato di Bob ed estrae la chiave pubblica di Bob.

Alcuni dei campi presenti in un certificato sono:

Nome campoDescrizione
Versionnumero di Versione delle specifiche X.509
Serial numberNumero univoco di identificazione del certificato rilasciato dalla CA
SignatureSpecifica l'algoritmo usato dalla CA per firmare questo certificato
Issuer nameIdentità della CA che ha rilasciato questo certificato
Validitydata di inizio e di fine del periodo di validità del certificato
Subject nameIdentità del soggetto la cui chiave pubblica è associata con questo certificato
Subject public keyLa chiave pubblica del soggetto e l'indicazione dell'algoritmo (e dei parametri) che devono essere usati con questa chiave