Tutte le funzioni di hash - ad eccezione delle funzioni di hashing perfette - hanno collisioni, poiché l'hashing normalmente associa un insieme più grande di input a un set di output più piccolo.
Detto questo, mod 10 è una funzione terribile per le password di hashing in quanto la quantità di collisioni non è accettabile in pratica.
A parte questo, è anche inaccettabile perché è troppo veloce, e perché è incredibilmente facile trovare un input corrispondente (perché si può semplicemente usare l'hash come password, corrisponderà sempre). Inoltre, non puoi ridurre realmente le collisioni aumentando il divisore. Ad esempio, se si impostasse su 1000, tutti gli input inferiori a 1000 in realtà non cambiano.
Questo è un bell'esempio che non tutte le funzioni di hash sono accettabili come funzioni hash crittografiche.
Le funzioni hash crittografiche devono essere pre-resistive, seconda pre-resistenza e resistenza alle collisioni.
mod non è nessuno di questi:
- Resistenza pre-immagine: dato un hash h, dovrebbe essere difficile trovare una password p tale che h = h (p). Non è. p = h funzionerà sempre.
- Seconda resistenza pre-immagine: data una password p1, dovrebbe essere difficile trovare un'altra password p2 tale che h (p1) = h (p2). Non è. p2 = p1 + divisore funzionerà.
- Resistenza alla collisione: dovrebbe essere difficile trovare due password p1 e p2 tali che h (p1) = h (p2). Ovviamente non lo è, visti i due punti precedenti.
Per le funzioni accettabili, vedi Come fare in modo sicuro le password di hash? .