Le funzioni hash crittografiche devono avere diverse proprietà:
- Resistenza alle preimmagini : dato x , dovrebbe essere impossibile trovare m tale che h (m) = x .
- Resistenza a second-preimages : dato m , dovrebbe essere impossibile trovare m tale che h (m) = h (m ') .
- Resistenza a collisioni : dovrebbe essere impossibile trovare m e m ' tale che m ≠ m' e h (m) = h (m ') .
Queste proprietà non sono equivalenti l'una all'altra e non è necessario che siano necessariamente tutte. Dipende dal protocollo in cui si utilizza la funzione di hash. Ad esempio, le funzioni di hash vengono utilizzate nel passaggio iniziale di firme digitali , per le quali le collisioni non sono un problema - a meno che l'autore dell'attacco sia in grado di scegliere un messaggio esatto da firmare. I dettagli possono essere sottili.
Se la funzione hash ha un output di n bit, allora esistono attacchi generici che trovano pre-immagini, seconde pre-impressioni e collisioni con costo, in modo repsettivo, 2 n , 2 n e 2 n / 2 . Un attacco "generico" significa che funziona per tutte le funzioni hash, indipendentemente da quanto perfette possano essere. Questo imposta il massimo livello di sicurezza raggiungibile.
Se "comprimi" l'output SHA-256 a 128 bit (qualunque sia la procedura di compressione che potresti voler usare, anche un semplice troncamento), allora stai definendo una nuova funzione di hash con un output a 128 bit. In quanto tale, la resistenza alle pre-immagini e alle seconde pre-immagini di quella funzione sarà al massimo 2 128 , e la resistenza alle collisioni sarà al massimo 2 64 . Pertanto, il tuo SHA-256 troncato offrirà "sicurezza a 128 bit" solo in contesti di utilizzo in cui le collisioni non rappresentano un problema. Ma dal momento che può essere abbastanza difficile accertare che le collisioni non siano effettivamente un problema, "comprimere" l'output della funzione hash non è raccomandato.
In generale , preferiamo essere sicuri che dispiaciuti; quindi, quando vogliamo "sicurezza a 128 bit" usiamo una funzione hash a 256 bit. In questo modo, non dobbiamo preoccuparci se le collisioni potrebbero essere sfruttate in un attacco reale o meno. Le collisioni SHA-256 non sono fattibili con la tecnologia esistente.