In primo luogo, perché stai implementando codice crittografico di basso livello per una pagina web? Penseresti che questo sia un problema risolto: usi un framework che usa le librerie.
In secondo luogo, l'hash protegge le password nel caso in cui gli hash trapelino. Il tuo sito non fornisce l'accesso al database delle password, quindi questa situazione idealmente non dovrebbe nemmeno verificarsi. I sali aiutano a difendere il database delle password nel suo insieme in quell'evento.
Se l'attaccante è concentrato su una singola password da quel database, allora non fa molta differenza. Rende il lavoro solo più difficile, nel senso che l'attaccante non può semplicemente recuperare la password da una tabella arcobaleno cercando l'hash. La forzatura bruta di una password con un salt è solo leggermente rallentata perché viene eseguito l'hashing di pochi byte in più, il che costa qualche ciclo macchina in più nei round di hashing.
Una volta, i sistemi Unix fornivano l'accesso (come i sistemi del campus per gli studenti) aveva le loro password violate 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 informazioni su un utente e quel file, / etc / passwd
era leggibile in tutto il mondo. La soluzione consiste nell'inserire le informazioni riservate in un file separato, / etc / shadow
. Presto: questo pone fine al cracking delle password da parte di script kiddie che hanno account legittimi e non privilegiati sul sistema.
Allo stesso modo, nessuno sarà bruto forzare le tue password a meno che tu non le lasci trapelare. qualcuno sta cercando la password di un determinato utente, c'è poco che può essere fatto per fermarlo.
Gli utenti che utilizzano le stesse password su sistemi diversi e non la cambiano per anni e anni saranno sempre vulnerabili. Puoi salarlo, peparlo e aggiungere ketchup; non farà la differenza.
I sali scoraggiano chi vuole craccare il database delle password nel suo insieme e raccogliere quante più password diverse possibile. I sali significano che ogni password deve essere forzata individualmente piuttosto che semplicemente recuperata da tabelle precalcolate. Se un salt ha N bit, allora, almeno idealmente, il database della tabella arcobaleno dell'attaccante deve essere 2 ^ N volte più grande. Un salt 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 sali diversi. Quindi ciò che un aggressore farà è prendere il dizionario delle password e hash ogni voce in 20 modi diversi con quei sali.
Quindi i sali non solo proteggono il tuo database dalla ricerca nella tabella arcobaleno, ma lo proteggono anche dal cracking della forza bruta di circa un fattore N, dove N è il numero di utenti. Per forzare N password, l'attaccante deve eseguire N volte il lavoro di forzatura bruta. (Supponendo che il sale sia abbastanza largo: almeno grande quanto il logaritmo in base 2 di N. Se un sale è largo, diciamo, solo 12 bit, allora ci possono essere solo 4096 sali diversi, non importa quanti utenti ci sono.)
Senza sali, questo non è vero. Forzare brutalmente un numero qualsiasi di password contemporaneamente è facile come forzarne una, quindi più utenti ci sono, maggiore è il guadagno per sforzo.