Per prima cosa: questa NON è crittografia. Questo è hashing. Se il tuo libro parla di "hash crittografato", quel libro è confuso e quindi confuso. In particolare, le password hash non vengono mai "decodificate", poiché non vengono crittografate in primo luogo.
Una funzione di hash crittografica offre una dimensione di output fissa. Nel caso di password , è necessario fare qualcosa di specifico chiamato "password-hashing", che ha una sua teoria (vedi questa risposta per i dettagli). Tuttavia, il principio principale è ancora lì: quando si verifica una password in arrivo, la password viene ridotta in un valore x e tale x viene confrontata con il valore memorizzato. Se la password è quella giusta, si ottiene lo stesso x . Tuttavia, se è stata immessa una password errata, viene ottenuto un altro valore x ', che è distinto da x con alta probabilità .
Questo è il punto importante qui: un utente malintenzionato potrebbe ancora ottenere (molto) fortuna e invece di inviare la password corretta, potrebbe teoricamente inciampare in un'altra password distinta che, per puro caso, darebbe lo stesso valore hash.
Naturalmente, non vogliamo che succeda una cosa del genere, e il modo migliore per rendere quell'evento assolutamente improbabile è quello di rendere questi valori x (cioè l'output della funzione di hash) abbastanza grande per sfortuna che non si verificherà nella pratica. Le funzioni di hash esistenti hanno una dimensione di output che è tipicamente di 16 byte (128 bit) o più. Questo vale anche per le funzioni di hashing della password; per esempio. bcrypt emette 192 byte.
(Ad aggancio dell'effetto è che gli output hash sono binari, ma spesso codificati in Base64 prima della memorizzazione nel database, il che aumenta le dimensioni, inoltre le funzioni di hashing della password richiedono alcuni parametri aggiuntivi, ad esempio un salt , che, in alcune funzioni, sono anche codificati nell'output, espandendo ulteriormente l'output.)
Le password scelte dall'utente raramente superano una dozzina di caratteri di lunghezza, quindi, in generale, l'output dell'hash sarà più grande. Tuttavia, le funzioni di hash possono utilizzare input di grandi dimensioni, quindi non esiste alcun motivo intrinseco perché le uscite hash debbano sempre essere più grandi delle password. Succede semplicemente che è necessario, per contrastare il "fortunato aggressore" descritto sopra, una dimensione di output che è "abbastanza grande" e che "abbastanza grande" è più grande della dimensione media delle password scelte dagli utenti umani.