Che cos'è "cracking"? Sta trovando un valore di password che il tuo sistema accetterà, cioè uno che corrisponderà a qualsiasi cosa il tuo sistema memorizzi come valore hash nel suo database. Se l'utente malintenzionato trova un'altra password, diversa dalla "vera" password, ma che corrisponde all'hash, allora l'attaccante vince comunque.
Per un determinato valore hash, ci sono già molte password corrispondenti (perché ci sono "solo" 2 256 possibili valori hash e molte più password possibili se accetti password "lunghe", diciamo 50 caratteri). Troncando il valore hash, si aumenta solo il numero di password che, una volta triturate e troncate, corrisponderanno a quelle memorizzate; cioè rendi le cose più semplici per l'aggressore.
Ora le cose non sono necessariamente così terribili. SHA-256 offre 256 bit di output perché prova ad offrire resistenza alle collisioni di almeno 2 128 e hai bisogno di 256 bit di output per ottenere quella resistenza. Tuttavia, le collisioni non rappresentano un problema per l'archiviazione delle password con hash; ciò che è necessario è resistenza alle pre-immagini . Questo richiede solo n bit di output per la resistenza 2 n . In altre parole, se si mantengono solo 128 bit (ovvero 32 caratteri esadecimali), si sta ancora "bene", o almeno non sostanzialmente peggiore di quello che si otterrebbe con i 64 caratteri completi.
Attenzione: un semplice hash è non buono . Anche se non lo indebolisci ulteriormente (almeno non in un modo praticamente significativo) troncandolo, hai già due problemi:
- Non hai sale, che consente all'aggressore di applicare il parallelismo in base al tempo o allo spazio. Vale a dire, attaccando più password contemporaneamente e / o usando tabelle precalcolate (tabelle arcobaleno).
- Un singolo hash è troppo veloce, rendendo facile per l'utente malintenzionato provare milioni, forse miliardi di potenziali password al secondo.
Quindi è necessario un processo di hashing della password migliore, che può essere configurato per la lentezza e che utilizza un salt (un nuovo salt casuale per la password each ). La raccomandazione abituale è bcrypt . Quindi, e solo allora, potrebbe prevedere un troncamento (ma mantenere almeno 128 bit, e le alterazioni fatte in casa agli algoritmi crittografici non sono raccomandate su base generale).
Modifica: per chiarire le cose: un utente malintenzionato con potenza di calcolo illimitata può tentare di enumerare tutte le password possibili e mantenere quelle che corrispondono ai valori hash memorizzati - questi sono candidati per essere il "vero" parola d'ordine. Troncando l'hash, si aumenta il numero di candidati, quindi, in una certa luce, l'attaccante è più lontano dall'indovinare la "vera password". Tuttavia, l'autore dell'attacco non è dopo la "vera password", ma dopo una password che garantisce l'accesso. Qualsiasi password che corrisponda al valore memorizzato concederà l'accesso, poiché il server concede l'accesso sulla base di "la password inserita corrisponde al valore hash memorizzato". Quindi ogni candidato è abbastanza buono per l'aggressore.