Una funzione hash è una funzione da molti a uno che mappa i suoi valori di ingresso in un valore appartenente ad un insieme finito. Tipicamente questo insieme è un intervallo di numeri naturali. Una semplice funzione hash è f(x) = 0 per tutti gli interi x. Una funzione hash più interessante è f(x) = x mod 37, che mappa tutti gli x al resto della divisione tra x e 37.
La firma digitale di un documento è il risultato dell'applicazione di una funzione hash al documento stesso. Per essere utile, però, la funzione hash deve soddisfare a due importanti proprietà. Primo, dev'essere difficile trovare due documenti che possiedono la stessa valore di hash; secondo, dato un valore di hash deve essere difficile recuperare il documento che ha prodotto quel valore.
Alcuni algoritmi a chiave pubblica[1] possono venire usati per firmare documenti. Colui che firma cripta il documento con la propria chiave privata. Chiunque voglia controllare la firma e vedere il documento usa semplicemente la chiave pubblica del firmatario per decifrare il documento. Questo algoritmo effettivamente soddisfa alle due proprietà richieste da una buona funzione hash, ma, in pratica, è troppo lento per risultare utilizzabile.
Un'alternativa consiste nel'utilizzare funzioni di hash pensate specificamente per soddisfare a queste due importanti proprietà. SHA e MD5 sono due esempi di tali algoritmi. Utilizzando un algoritmo di questi, un documento viene firmato applicando la funzione di hash ed il valore restituito rappresenta la firma. Un'altra persona può controllare la firma applicando la stessa funzione di hash alla propria copia del documento e confrontando il valore di hash ottenuto con quello del documento originale. Se coincidono, può essere praticamente certo che i documenti sono identici.
Ovviamente ora il problema consiste nell'usare una funzione di hash per firme digitali senza permettere ad un malintenzionato di interferire con il controllo della firma. Se documento e firma sono spediti in chiaro, un malintenzionato potrebbe infatti modificare il documento e generare la corrispondente firma senza che il destinatario ne venga a conoscenza. Se solo il documento è cifrato, un malintenzionato potrebbe manomettere la firma e provocare un fallimento del controllo sulla firma. Una terza possibilità consiste nell'usare una cifratura a chiave pubblica ibrida per criptare sia la firma che il documento. Il firmatario usa la propria chiave privata e chiunque può adoperare la corrispondente chiave pubblica per controllare la firma ed il documento. Quest'ultimo procedimento sembra corretto, ma in effetti non ha senso. Se tale algoritmo mettesse veramente al sicuro il documento, esso sarebbe anche al sicuro da eventuali manomissioni e non ci sarebbe bisogno di alcuna firma. Il problema più serio, comunque, consiste nel fatto che tutto ciò non protegge da possibili manomissioni né la firma né il documento. Con il nostro algoritmo, infatti, solo la chiave di sessione per l'algoritmo simmetrico viene criptata usando la chiave privata del firmatario. Chiunque è in grado di usare la chiave pubblica per recuperare la chiave di sessione. Perciò sarebbe banale per un malintenzionato recuperare tale chiave di sessione e usarla per criptare documenti modificati e firme da spedire ad altri in nome del mittente.
Un algoritmo valido è quello che usa un algoritmo a chiave pubblica per cifrare solo la firma. In particolare, il valore di hash viene criptato usando la chiave privata del firmatario permettendo a chiunque di controllare la firma usando la corrispondente chiave pubblica. Il documento firmato può essere spedito usando qualsiasi altro algoritmo di cifratura, compreso nessuno se si tratta di un documento pubblico. Se il documento venisse modificato, il controllo della firma fallirebbe, ma ciò è quello a cui serve il controllo della firma. Il Digital Signature Standard[2] (DSA) è un algoritmo per la firma a chiave pubblica che funziona come appena descritto. Il DSA è l'algoritmo principale usato da GnuPG per firmare documenti.
[1] | L'algoritmo deve possedere la proprietà che l'effettiva chiave pubblica o privata possa essere usata dall'algoritmo di cifratura come chiave pubblica. L'RSA è un esempio di tale algoritmo, mentre ElGamal non possiede tale proprietà. |
[2] | Lo standard per la firma digitale. |