In primo luogo, perché stai implementando un codice crittografico di basso livello per una pagina web? Si potrebbe pensare che questo è un problema risolto: si utilizza un framework che utilizza le librerie.
In secondo luogo, l'hash protegge le password in caso di perdita degli hash. Il tuo sito non fornisce l'accesso al database delle password, quindi questa situazione dovrebbe idealmente non presentarsi. I sali aiutano a difendere il database delle password nel suo complesso in quell'evento.
Se l'attaccante si concentra su una singola password da quel database, quindi non fa molta differenza. Rende solo più difficile il lavoro nel senso che l'attaccante non può semplicemente recuperare la password da una tabella arcobaleno osservando l'hash. La forzatura bruta di una password con un salt viene rallentata solo leggermente perché alcuni hash sono più hash, il che costa un paio di cicli in più nei round di hashing.
C'erano una volta i sistemi Unix che forniscono l'accesso pubblico (come i sistemi di campus per gli studenti) a cui le loro password sono state spezzate a destra ea sinistra. C'erano vari motivi per cui questo era facile, ma il problema principale era semplice: le informazioni sensibili sull'hash della password erano conservate nello stesso file degli altri campi di informazione su un utente, e quel file, /etc/passwd
era leggibile a livello mondiale. La correzione consiste nel mettere le informazioni sensibili in un file separato, /etc/shadow
. Presto: che termina la violazione della password da parte degli script kiddies che hanno account legittimi e non privilegiati sul sistema.
Allo stesso modo, nessuno sarà forzato a forzare le password a meno che non le lasci sfuggire.
Se fuoriescono e qualcuno cerca la password di un particolare utente, c'è poco che può essere fatto per fermarli.
Utenti che utilizzano le stesse password su sistemi diversi e non cambiano per anni e
gli anni saranno sempre vulnerabili. Puoi salarlo, peparlo e aggiungere ketchup; non farà la differenza.
I sali scoraggiano qualcuno che vuole rompere il database delle password nel suo insieme e raccogliere quante più password possibili. Sali significa che ogni password deve essere forzata alla bruta individualmente anziché essere semplicemente recuperata da tabelle pre-calcolate. Se un sale ha N bit, quindi, almeno idealmente, il database della tabella arcobaleno dell'attaccante deve essere 2 ^ N volte più grande. Un sale a 32 bit significa che hai bisogno di un database di tabelle arcobaleno quattro miliardi di volte più grande per cercare solo le password.
Se il tuo sito ha solo 20 utenti, ovviamente ci sono solo fino a 20 diversi sali. Quindi, ciò che un utente malintenzionato farà è prendere il dizionario delle password e cancellare ogni voce in 20 modi diversi con quei sali.
Quindi i sali non proteggono il database solo dalla ricerca della tabella arcobaleno, ma lo proteggono anche dal cracking della forza bruta di circa un fattore di N, dove N è il numero di utenti. Per le password N brute force, l'hacker deve fare N volte il lavoro come forzante bruto. (Supponendo che il sale sia abbastanza largo: almeno grande quanto il logaritmo di base 2 di N. Se un sale è solo, diciamo, largo 12 bit, allora ci possono essere solo 4096 diversi sali, indipendentemente da quanti utenti ci siano.)
Senza sali, questo non è vero. Forzare brutalmente un numero qualsiasi di password allo stesso tempo è semplice quanto forzare il bruto, quindi più utenti ci sono, più grande è il profitto per sforzo.