
Verifica l'integrità dei file con uno script tuo
Se non ti fidi di quello che scarichi da Internet o di quello che ti passano gli amici, controlla che tutto sia integro con MD5 e le somme di controllo
(pagina 1 di 4)

In questo articolo vedremo come sia
possibile tenere sotto controllo un insieme
di file, in modo da poter rilevare
automaticamente le modifiche fatte;
oltre che per applicazioni di sicurezza questo
metodo può essere convenientemente utilizzato
per programmare dei backup, salvando solamente
quei file che abbiano subito delle modifiche
dall'ultimo salvataggio. Innanzitutto è
utile capire come sia possibile rendersi conto
se un file è stato modificato. Il primo modo che
viene in mente è quello di effettuare un confronto tra le due versioni
del file con un programma come diff, ma questa soluzione presenta un
inconveniente: è necessario possedere entrambe le versioni del file per
poter effettuare il confronto; nel caso di un backup questo risulta scomodo,
in quanto è necessario recuperare il backup stesso, che solitamente
risiede su un supporto esterno (disco ottico o nastro) ed estrarre
i file, cosa onerosa se i file in questione sono di dimensioni notevoli.
Ma nel caso in cui non si possegga un backup del file è addirittura impossibile,
con questo metodo, sapere se il file è stato modificato. Una soluzione
più complessa potrebbe essere quella di salvare alcuni parametri
del file, come ad esempio la dimensione, per poi utilizzarli come
indice di cambiamento. Questo approccio risolve il problema accennato
precedentemente: non è più necessario avere una copia del file salvata
in modo da poterla confrontare con quella attuale, basta avere una
registrazione della dimensione del file. Sfortunatamente, la dimensione
di un file non dice nulla sul contenuto, e un file può essere modificato
mantenendo la stessa dimensione che aveva precedentemente anche
senza la volontà di ingannare qualcuno.
 |
L'aggiunta di un file e il conseguente update del database |
Algoritmi di controllo
La soluzione al nostro dilemma ci viene dai cosiddetti algoritmi di controllo
o somme di controllo (checksum): questi sono metodi matematici
che permettono di evidenziare se una certa sequenza di numeri
è cambiata, e sono comunemente usati in vari protocolli di trasmissioni
dati. Vediamo un esempio molto banale: possediamo
una sequenza di 5 numeri decimali e
vogliamo trovare un modo semplice per essere
sicuri che i numeri siano gli stessi in vari momenti
di tempo; il modo più semplice è di sommare
tutti i numeri e salvare la somma risultante
(da qui il nome “somma di controllo”):
sequenza: 14 86 34 29 76
somma di controllo: 239
A questo punto, sapendo che i numeri sono 5 e che la somma fa 239 possiamo identificare subito se la sequenza è stata cambiata. Ad esempio, modificando l'ultimo numero otteniamo
sequenza: 14 86 34 29 75
somma di controllo: 238
Ovviamente, si nota subito un possibile problema: modificando accuratamente
i numeri si ottiene la stessa somma di controllo, benché il
contenuto non sia lo stesso; ad esempio se incrementiamo di 1 l'ultimo
numero e diminuiamo di 1 un altro, la somma di controllo non cambia.
Nella terminologia tecnica questo fatto prende il nome di “collisione”
dell'algoritmo di controllo: un algoritmo è tanto migliore quanto è più
difficile ottenere collisioni; una collisione permette di “ingannare” l'algoritmo,
mostrando un contenuto modificato come se fosse l'originale.
Nel nostro esempio l'algoritmo di controllo è estremamente semplice,
ed infatti è stato molto facile trovare una collisione; si faccia attenzione
che le collisioni possono avvenire sia casualmente che essere provocate
con intenzione, e che il metro di giudizio con cui si valuta un algoritmo
deve essere proporzionato all'utilizzo che se ne fa. In effetti
molti algoritmi utilizzati per le somme di controllo (compres