Fornirò un approccio leggermente diverso su questo.
Conservo sempre il sale mescolato con l'hash con password salata.
Ad esempio, inserirò la prima metà del sale prima dell'hash salato della password e l'ultima metà del sale dopo l'hash salato della password. L'applicazione è a conoscenza di questo progetto, quindi può recuperare questi dati e ottenere l'hash salt e salted-password.
La mia logica per questo approccio:
Se i dati di password / hash sono compromessi e cadono nelle mani di un utente malintenzionato, quest'ultimo non saprà quale sia il problema derivante dall'osservazione dei dati. In questo modo un utente malintenzionato non può praticamente eseguire un attacco a forza bruta per ottenere una password che corrisponda all'hash, poiché non conosce l'hash per cominciare e non ha modo di sapere quali parti dei dati sono parti del sale, o parti dell'hash della password salata (a meno che non conosca la logica di autenticazione dell'applicazione ).
Se l'hash della password salata viene archiviato così com'è, è possibile eseguire un attacco di forza bruta per ottenere una password che, quando salata e hash, produce gli stessi dati dell'hash della password salata.
Tuttavia, ad esempio, anche se l'hash della password salata è stato archiviato così com'è, ma in attesa di un singolo byte casuale, fintanto che l'attaccante non è a conoscenza del fatto che questo primo byte deve essere scartato, ciò aumenterebbe anche la difficoltà di attacco. La tua applicazione saprebbe scartare il primo byte dei dati quando viene utilizzata per autenticare l'utente.
La conclusione a questo ..
1) Non archiviare mai i dati utilizzati dall'applicazione di autenticazione nella sua forma esatta.
2) Se possibile, mantenere segreta la logica di autenticazione per una maggiore sicurezza.
Fai un passo avanti ..
Se non riesci a mantenere segreta la logica di autenticazione dell'applicazione, molte persone sanno come vengono archiviati i tuoi dati nel database. E supponiamo che tu abbia deciso di memorizzare l'hash con password salata mescolato insieme con il sale, con parte del sale che precede l'hash con password salata e il resto del sale che lo aggiunge.
Quando generi il sale casuale, puoi anche decidere in modo casuale quale proporzione del tuo sale memorizzerai prima / dopo l'hash della password salata.
Ad esempio, si genera un sale casuale di 512 byte. Aggiungi il sale alla tua password e ottieni l'hash SHA-512 della tua password salata. Si genera anche un numero intero casuale 200. Quindi si memorizzano i primi 200 byte del sale, seguiti dall'hash della password salata, seguito dal resto del sale.
Quando si autentica l'immissione della password di un utente, l'applicazione passa sulla stringa e assume che il primo 1 byte dei dati sia il primo 1 byte del salt, seguito dall'hash salato. Questo passaggio fallirà. L'applicazione continuerà utilizzando i primi 2 byte dei dati come i primi 2 byte del sale e si ripeterà fino a quando non verrà trovato un risultato positivo dopo aver utilizzato i primi 200 byte come i primi 200 byte del sale. Se la password è errata, l'applicazione continuerà a provare tutte le permutazioni fino a quando non ne verrà trovata nessuna.
I pro di questo approccio:
Maggiore sicurezza - anche se la logica di autenticazione è nota, la logica esatta è sconosciuta al momento della compilazione. È praticamente impossibile eseguire un attacco a forza bruta, anche con la conoscenza della logica esatta. L'aumento delle lunghezze di sale aumenterà ulteriormente la sicurezza.
I contro di questo approccio:
Poiché la logica esatta viene dedotta in fase di esecuzione, questo approccio richiede molta CPU. Più lunga è la lunghezza del sale, più diventa intenso questo approccio alla CPU.
L'autenticazione di password errate comporterà il più alto costo della CPU. Questo può essere controproducente per richieste legittime, ma aumenta la sicurezza contro gli aggressori.
Questo approccio può essere implementato in vari modi e può essere reso ancora più sicuro utilizzando sali a larghezza variabile e / o hash con password salate.