Un hash "sicuro" è un hash che si ritiene sia difficile "spoofare" in modo formulabile e riproducibile senza una conoscenza preliminare del messaggio utilizzato per creare l'hash. Poiché tali informazioni sono generalmente segrete, quindi la necessità di un hash, questa è una buona proprietà di una funzione di hashing destinata all'uso nell'autenticazione.
Un hash è generalmente considerato "sicuro" se, dato un messaggio M, una funzione hash hash () e un valore hash H prodotto da hash (M) con una lunghezza in bit L, nessuna delle seguenti operazioni può essere eseguita in meno di O (2 L ) tempo:
- Dato hash () e H, produce M. (resistenza preimage)
- Dato hash () e M, produce un M 2 diverso tale che hash (M 2 ) == H. (resistenza alla collisione debole)
- Dato hash (), produce qualsiasi M 1 e M 2 tale che hash (M 1 ) == hash (M 2 ). (forte resistenza alle collisioni)
Inoltre, un hash "sicuro" deve avere una lunghezza hash L tale che 2 Lnon è un numero fattibile di passaggi per un computer per eseguire l'hardware corrente dato. Un hash intero a 32 bit può avere solo 2,1 miliardi di valori; mentre un attacco preimage (trovare un messaggio che produce un hash H specifico) richiederebbe un po 'di tempo, non è fattibile per molti computer, in particolare quelli nelle mani di agenzie governative noleggiate con la violazione del codice. Inoltre, un algoritmo che crea e archivia messaggi casuali e i loro hash avrebbero, secondo le probabilità, una possibilità del 50% di trovare un hash duplicato con ogni nuovo messaggio dopo aver provato solo 77.000 messaggi e avere una probabilità del 75% di colpire un duplicato dopo solo 110.000. Anche gli hash a 64 bit hanno ancora il 50% di probabilità di scontrarsi dopo aver provato solo circa 5 miliardi di valori. Tale è il potere dell'attacco di compleanno a piccoli hash. Al contrario,numeri decilioni (1,5 * 10 34 ).
La maggior parte degli attacchi dimostrati agli hash crittografici sono stati attacchi di collisione e hanno dimostrato la capacità di generare messaggi di collisione in meno di 2 L di tempo (la maggior parte è stata ancora in tempo esponenziale, ma ridurre l'esponente della metà è una riduzione significativa della complessità in quanto rende un hash a 256 bit facile da risolvere come un 128 bit, un 128 bit facile da risolvere come un 64 bit, ecc.).
Oltre alle piccole dimensioni dell'hash, altri fattori che possono rendere un hash dimostrabilmente insicuro sono:
Basso lavoro: un hash progettato per essere utilizzato da una hashtable o per altri scopi di tipo "checksum" è generalmente progettato per essere computazionalmente economico. Ciò rende molto più facile un attacco a forza bruta.
"Sticky State" - La funzione di hashing è soggetta a schemi di input in cui il valore di hash corrente di tutti gli input finora non cambia quando viene dato un particolare byte aggiuntivo di input. Avere "stato appiccicoso" facilita la ricerca di collisioni, perché una volta identificato un messaggio che produce un hash "stato appiccicoso" è banale generare altri messaggi che hanno lo stesso hash aggiungendo byte di input che mantengono l'hash nel suo "stato appiccicoso" ".
Diffusione: ogni byte di input del messaggio deve essere distribuito tra i byte del valore hash in un modo altrettanto complesso. Alcune funzioni hash creano modifiche prevedibili a determinati bit nell'hash. Ciò rende di nuovo banale la creazione di collisioni; dato un messaggio che produce un hash, le collisioni possono essere facilmente create introducendo nuovi valori nel messaggio che influenzano solo i bit che cambiano in modo prevedibile.