Come ha detto Thomas, una vera e propria funzione di hash crittografica non dovrebbe contenere nessuna informazione sulla password. Questo è dovuto a poche cose:
-
Uscita a lunghezza fissa: l'output dell'hash avrà sempre una certa lunghezza (varia in base all'algoritmo), indipendentemente dalla lunghezza o meno della password.
-
Output unici e dissimili: qualsiasi modifica della password dovrebbe comportare una modifica così significativa dell'output, che due password molto simili (ad esempio: "password1" e "password2") non sono simili dopo l'hashing.
-
Unico, per utente sale: un elemento aggiunto viene utilizzato nella funzione di hashing che è univoca per ciascun utente, in modo che due utenti che scelgono la stessa password non abbiano lo stesso hash della password.
Come è stato menzionato nei miei commenti, e incluso nella risposta di Grawulf, ci sono stati storicamente esempi di funzioni di hashing che violano questi principi. Forse l'esempio più noto di questo è LANMAN (a.k.a .: hash LM o hash di LAN Manager). Questa funzione di hashing è stata utilizzata nelle versioni di Windows precedenti a NT ed è ancora inclusa (sebbene disabilitata per impostazione predefinita) per la compatibilità con le versioni precedenti nelle versioni moderne.
I problemi con LANMAN sono molti, ma molti di essi sono radicati nel suo uso di DES - in particolare la parte che consente di indovinare la lunghezza della password di un utente. DES è limitato a una lunghezza della chiave a 56 bit, che si traduce in 7 byte o caratteri ASCII. Ovviamente questo doveva essere noto, anche nei giorni precedenti al NT, essere troppo piccolo per una password abbastanza strong.
Quindi, il lavoro di Microsoft consisteva nel dividere a metà la password dell'utente, l'hash ogni metà separatamente, quindi attaccare le stringhe di hash per formare l'hash LM finale. Ciò consentirebbe agli utenti di creare password lunghe fino a 14 caratteri. Per le password più brevi di 14 caratteri, alla fine verrà aggiunto un riempimento di caratteri null (prima della divisione della password) per compilare il resto delle chiavi DES. Ovviamente, questo significa che tutte le password più brevi di 7 caratteri finirebbero con la seconda metà del loro hash (avendo iniziato come tutti i caratteri null e hash senza sale) essendo identiche a tutte le altre password più brevi di 7 caratteri.
Se Microsoft avesse usato una soluzione per utente, avrebbe almeno impedito di indovinare facilmente la lunghezza della password di un utente dall'output dell'hash. Avrebbe anche reso gli attacchi con i dizionari molto più difficili. Tuttavia, ci sono altre debolezze intrinseche (oltre lo scopo di questa domanda) nella funzione che ancora la rendono del tutto inadatta per l'uso nel mondo di oggi.
Le moderne funzioni di crittografia sono molto più potenti e intelligenti di questo, e quindi molto meno probabilità di perdite di dati particolari sulla lunghezza della tua password. Tuttavia, è bene tenere a mente questo dettaglio storico come un esempio di come non alle password hash. (Naturalmente, non è mai una buona idea girare la tua crittografia in ogni caso.)
SUGGERIMENTO: mentre le password di hashing con LANMAN sono state disabilitate per impostazione predefinita da Vista, è ancora una funzionalità disponibile per la retrocompatibilità. Se vuoi assicurarti che le tue password di Windows non possano e quindi non siano elaborate come LM hash su qualsiasi sistema Windows, nonostante come l'amministratore di sistema possa configurarlo, assicurati le tue password hanno una lunghezza minima di 15 caratteri.