La firma digitale



La crittografia a chiave pubblica è ritenuta una delle più importanti intuizioni nel campo delle comunicazioni anche per il fatto che può essere utilizzata per risolvere il problema della firma digitale.

La firma digitale di un documento (per documento intendiamo qualsiasi cosa sia memorizzata con tecnologie informatiche e quindi trasmissibile tramite sistemi di comunicazione quali Internet) si pone di risolvere tre problemi (definiti come autenticazione e integrità dei dati):

  • che il destinatario possa verificare l'identità del mittente
  • che il mittente non possa disconoscere un documento da lui firmato
  • che il destinatario non possa inventarsi o modificare un documento firmato da qualcun altro

Per firmare un documento si utilizza come detto la crittografia a chiave pubblica, in una modalità che può essere definita inversa. Se un individuo cifra un messaggio con la sua chiave privata, quel messaggio cifrato potrà essere letto da tutte le persone che possiedono la sua chiave pubblica. Se queste riusciranno a decifrare il messaggio avranno la certezza che è stato inviato dal proprietario della chiave pubblica usata per la decifratura. Tutto è garantito dal principio base della crittografia asimmetrica, dal fatto cioè che la chiave segreta decifra solo ciò che è stato cifrato con la rispettiva chiave pubblica e viceversa.

Come si può notare la firma digitale non garantisce la segretezza del contenuto del documento, infatti tutti i possessori della chiave pubblica del mittente possono averne accesso. Il problema però è facilmente risolvibile in modo intuibile: è sufficiente crittografare il messaggio firmato con una delle tecniche viste fino a questo punto. Il ricevente non dovrà fare altro che decifrare il messaggio (in questo caso solo lui potrà farlo) e successivamente controllarne la firma.

I più attenti di voi avranno però notato una piccola incongruenza in quanto detto fino a questo momento. Parlando di crittografia a chiave pubblica avevamo sottolineato l'eccessiva lentezza del sistema, che ne rendeva sconsigliato l'utilizzo "esclusivo" per la quantità di dati generata e il tempo impiegato, e visto che le funzioni utilizzate sono le stesse, anche se in senso inverso, il problema continua a persistere. La soluzione consiste nel cifrare solo una piccola parte dell'intero messaggio. Ovviamente la parte di messaggio da cifrare non può essere scelta in modo qualsiasi, si utilizzano in pratica delle funzioni di Hash.

Funzioni di Hash

Una di hash, detta anche one way hash, trasforma un testo normale di lunghezza arbitraria in una stringa di lunghezza relativamente limitata. Questa stringa rappresenta una sintesi del messaggio (message digest) che non è altro che una vera e propria impronta digitale unica che viene definita valore di hash e che gode di tre importanti proprietà:

  • dato un messaggio si può facilmente calcolare il suo valore di hash
  • dato il valore di hash è impossibile risalire al messaggio (per questo one way hash)
  • non si possono generare due messaggi che abbiano la stessa sintesi. Sappiamo che questo non è praticabile ma in genere si intende che la probabilità di collisione (due messaggi con la stessa sintesi) deve essere molto bassa.

Solitamente per le impronte vengono utilizzati 128 bit, ma il valore può essere qualsiasi, tenendo conto che più basso è e più alta è la probabilità di collisione.

Per una dimostrazione forniamo 2 valori di hash ottenuti tramite l'algoritmo MD5 di cui parleremo tra poco, che estrae da input di qualunque dimensione valori di hash di 128 bit che possono essere rappresentati con 16 cifre esadecimali:

"a" --> 60B725F10C9C85C70D97880DFE8191B3
"Prova hashing per HTMLit" --> EFC56F6C520FFB812BB9854D093AD43

come si può notare, da stinge in ingresso di lunghezza significativamente differente, sono stati calcolati due valori hash della stessa lunghezza e apparentemente simili. La lunghezza dei valori di hash varia a seconda degli algoritmi. Quelli a 128 bit sono i più comuni, come il sopra citato MD5 del 1992.

L'algoritmo MD5 utilizza un buffer di 128 bit inizializzato a un valore prefissato. Divide il messaggio originale (visto come una stringa di bit) in blocchi di 512 bit aggiungendo se necessario dei bit aggiuntivi per arrivare a tale cifra e per ogni blocco di 128 bit vengono eseguiti quattro passi che consistono nel mescolare completamente i 512 bit in ingresso con il buffer di 128 fino a che tutti i blocchi in ingresso sono stati consumati. Alla fine il buffer sarà il message digest del testo in ingresso.

Ultimi articoli Sicurezza

Nmap: tecniche per evadere un firewall

Vediamo come sfuggire ai controlli di un firewall utilizzando Nmap.

Sfruttare vulnerabilità XSS con BeEF

Usiamo BeEF per automatizzare lo sfruttamento di vulnerabilità Cross...

Trojan Flashback: rimuoverlo da Mac OS X

Individuiamo e rimuoviamo il trojan Flashback da Mac OS X

Individuare vulnerabilità in Joomla con JoomScan

Usiamo JoomScan per verificare la sicurezza di Joomla e la presenza...

XSS: attacchi avanzati

Approfondiamo le vulnerabilità Cross Site Scripting analizzando...

Altri articoli

Guide Sicurezza

Guida SQL Injection con Sqlmap

Scopriamo se le nostre applicazioni web sono vulnerabili alle SQL...

Guida sicurezza applicazioni Web

Le tecniche di attacco più comuni, i metodi per verificare la...

Guida Sicurezza wireless

Quali sono i pericoli di sicurezza di una rete senza filo e quali...

Altre guide

Newsletter @Sicurezza

Ogni lunedì, direttamente nella tua e-mail: approfondimenti e bollettini su virus, vulnerabilità e sicurezza informatica.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto