Dipende da cosa ti vuoi difendere contro
La sicurezza non è mai un gioco valido per tutti. Se lo fosse, allora non ci sarebbero 12941 diversi algoritmi di hash. Invece, devi capire che ogni misura di sicurezza ti difende da un tipo specifico di attacco. Metti una password nel tuo computer per difenderti da persone casuali che accedono ad esso, non perché è così divertente digitare whereD1DweG0sowron6
ogni volta che accedi.
Come per gli algoritmi hash, puoi classificarli grossolanamente come "hash crittografici" e "hash non crittografici". Gli algoritmi di hash crittografici sono progettati per resistere a un numero di attacchi, mentre gli hash non crittografici sono progettati per essere il più veloci possibile. 1 MD5, ad esempio, è considerato un hash crittografico, ma è così rotto che è utilizzabile solo come hash non crittografico.
Quando utilizzare un hash non crittografico
Se il tuo obiettivo è quello di rilevare i bit-flip quando copi un file da una posizione a un'altra (ad esempio, una pen drive a un laptop), quindi MD5 è la scelta giusta. Mi spingerei persino a dire che qualsiasi hash veloce e non crittografico è buono. Quando copi i file, realisticamente non devi temere l'interferenza dell'attaccante. Se sei paranoico sul fatto che gli hacker possano modificare il tuo kernel, l'aggiunta di hash non risolverà i tuoi problemi.
Verifica dell'integrità dei file con interferenze da parte dell'utente malintenzionato
Se intendi firmare e pubblicare quei file, allora un utente malintenzionato potrebbe avere la possibilità di creare un file potenzialmente legittimo con lo stesso hash, il che significa che la tua firma è altrettanto valida sul file dannoso.
Un esempio
Diciamo che il tuo messaggio originale m1
assomiglia a questo:
I hereby declare that the bunny rules!
Usi la tua funzione hash h(m1)
e ottieni il digest d1
. Successivamente, firmi il digest d1
e ottieni una firma s1
.
Quindi pubblichi il tuo messaggio m1
, la tua firma s1
e la tua funzione hash h()
.
Potrei essere l'autore dell'attacco nello scenario e creare un messaggio m2
che ha lo stesso identico hash nella funzione hash scelta:
It is publicly known that dogs are better than bunnies in every regard...
Poiché h(m1) = h(m2) = d1
, la firma s1
è valida sia per il tuo% originalem1
che per il mio% dannoso% co_de.
Per difendersi da tali attacchi, è fondamentale scegliere un algoritmo di hash strong con elevata resistenza alle collisioni. Ciò significa che diventa molto difficile per me trovare un m2
dove m2
.
Buone scelte includevano SHA256 e SHA512, così come tonnellate di altri. Sembra che tutti abbiano alcune funzioni hash preferite non tradizionali, ma SHA256 e SHA512 hanno un supporto molto diffuso e sarà difficile per te trovare un sistema che non supporti questi hash. E poiché i tuoi file sono molto piccoli, il calcolo dell'hash dovrebbe essere quasi istantaneo.
Ad esempio, sulla mia macchina a 800 MHz, il calcolo dell'hash SHA512 di un file casuale a 16k ha richiesto 3 ms, quindi anche su un tostapane dovrebbe essere relativamente veloce.
1 Puoi vedere la stessa cosa con generatori di numeri casuali. I PRNG crittografici mirano a fornire numeri casuali davvero difficili da indovinare, mentre i PRNG non crittografici mirano a fornire solo numeri che sembrano casuali a prima vista e che lo fanno velocemente.