Se un attaccante ottiene l'accesso agli hash memorizzati e sa che ognuno di questi codifica solo un singolo personaggio, può forzare questo personaggio con pochissime ipotesi. Il sale non protegge da questo dato che fa parte dell'hash della password memorizzato e quindi noto all'attaccante. Il rallentamento eseguito da bcrypt non è d'aiuto, dal momento che solo alcuni caratteri devono essere indovinati.
Ancora peggio, una volta che l'attaccante ha avuto accesso ai primi 3 caratteri della password in questo modo facile, la forzatura bruta dei caratteri rimanenti è considerevolmente meno impegnativa, come se la password dovesse essere obbligatoriamente forzata.
Se non esiste un hash separato per ciascuno dei primi 3 caratteri, ma solo un hash su tutti e tre insieme, non è così insicuro come con tre password di una sola lettera, ma è ancora totalmente insicuro.
Per fare in modo che il problema di memorizzare uno o alcuni caratteri invece di tutti i caratteri di una password in un hash separato mostri chiaramente che la matematica coinvolta considera il seguente esempio:
- Supponendo che una password sia composta da 100 cifre casuali.
- Quando brute-forzando questa password in una volta un attaccante dovrebbe controllare al massimo tutte le 2 ^ 100 permutazioni e in media la metà che è ancora troppo per gli attacchi pratici.
- Ma, se tutte queste cifre sono memorizzate in hash separati e l'attaccante ottiene così un riscontro positivo già dopo aver infranto la cifra per una posizione specifica, ha solo bisogno di almeno 10 tentativi per ciascuna posizione e quindi di 10 * 100 tentativi in totale. In questo modo la password diventa banale in breve tempo anche se ogni tentativo richiede un secondo intero. E nessun sale proteggerà contro questo.
- Se non hai una sola cifra, ma solo combinazioni di 3 cifre, migliora un po 'ma è ancora lontana dalla sicurezza. In questo caso ognuno di questi hash per 3 cifre richiederebbe al massimo 1000 tentativi. Con 33 di tali hash (e uno per una singola cifra) o memorizza la password originale di 100 cifre, un attacker avrebbe bisogno al massimo di 33 * 1000 + 10 tentativi, cioè è ancora assurdamente insicuro.