Ci sono alcune proprietà che crittografano le funzioni di hash
richiedono strongmente, che non sono così strongmente richiesti per
funzioni hash non crittograficamente sicure:
- resistenza preimage (dato un hash
h
deve essere difficile trovare un messaggio m
che produce h
quando hash
- resistenza di collisione debole (dato un messaggio
m1
deve essere difficile trovare un messaggio diverso m2
in modo che m1
e m2
generino lo stesso hash)
- strong resistenza alle collisioni (dovrebbe essere difficile trovare tutti i messaggi
m1
e m2
che producono lo stesso hash)
In questi punti, vedi molto difficile , che è una misura qualitativa invece di una quantitativa. La migliore risposta qui è la fattibilità: c'è una linea confusa quando qualcosa diventa fattibile e quelle linee si spostano nel tempo (poiché le capacità di calcolo crescono esponenzialmente secondo la Legge di Moore, una volta che i problemi difficili possono essere risolti dal tuo cellulare).
In generale, è una buona pratica presumere che difficile significhi che il tempo per raggiungere un obiettivo è NP-completo. Ciò significa che il tempo richiesto per spezzare l'hash aumenta notevolmente man mano che aumenti la lunghezza dell'hash.
Un altro punto è che un algoritmo di hashing crittograficamente sicuro può essere utile in alcune applicazioni, ma non in altre. Dipende dal modello del tuo aggressore, dalla natura delle informazioni che vuoi proteggere e cose come i requisiti di prestazione (come regola generale, migliori sono le proprietà crittografiche di un hash, peggiore è il comportamento di runtime).