Non esiste una risposta assoluta, perché dipende dal modello di attacco . Troncando l'hash, si facilitano alcune operazioni; questo è un male se l'attaccante vuole eseguire queste operazioni e renderle più facili effettivamente le rende fattibili .
Ci sono tre caratteristiche principali che le funzioni di hash crittografiche cercano di soddisfare:
-
Resistenza alle preimmagini: data x , dovrebbe essere impossibile trovare m tale che h (m) = x .
-
Resistenza alle seconde preimmagini: data m , dovrebbe essere impossibile trovare m '≠ m tale che h (m) = h (m ') .
-
Resistenza alle collisioni: dovrebbe essere impossibile trovare m '≠ m tale che h (m) = h (m') .
Per una perfetta funzione di hash che ha un output di bit n , i costi per trovare pre-immagini, seconde pre-immagini o collisioni saranno, rispettivamente, 2 n , 2 n e 2 n / 2 . Troncando l'output dell'hash, abbassi questi costi in modo corrispondente. Come regola generale, un costo di 2 64 è molto difficile (fattibile, ma richiede più di una dozzina di PC) e 2 80 è impossibile.
Nel tuo caso, se una collisione è interessante per l'attaccante, e può scegliere cosa è stato cancellato, quindi l'attaccante proverà a inserire due elementi di dati che implica una collisione hash (sul tuo hash troncato). Troncare a 12 byte rende l'attacco abbastanza fattibile, facile se si scende a 8 byte. D'altra parte, se tutto ciò che l'utente malintenzionato può fare è cercare di trovare qualche elemento dati corrispondente a un dato hash troncato (secondo preimage), quindi a 10 o 12 byte questo è ancora troppo difficile per essere fattibile, e con 8 byte è semplicemente "molto costoso" (quindi probabilmente non ne vale la pena).
Se non ci sono attaccanti e stai solo combattendo la sfortuna, allora il troncamento a 8 byte comporta il rischio di collisioni spurie; dovresti raggiungere la prima collisione dopo (in media) inserendo alcuni miliardi di voci. A seconda della situazione, questo può o non può essere tollerato.