Ecco la mia comprensione di uno schema di autenticazione salato / con hash:
string plaintextPass = Request.Form["password"];
string salt = UserRecordFromDb.Salt;
string toHash = salt + plaintextPass;
string hash = bcrypt(toHash);
return(hash == UserRecordFromDb.HashedPassword);
Il problema è che l'algoritmo aggiunge il di sale in modo prevedibile . Se potessi usare una tabella arcobaleno per ottenere il testo in chiaro incluso il sale , potrei trovare e buttare via il sale. Ci sono abbastanza utenti che usano comunque password sbagliate per rendere più facile riconoscere il modello di aggiunta di sale 1 .
Ad esempio, se ho recuperato questi elementi in chiaro dal mio attacco della tabella arcobaleno:
1: passwordW0fkvE
2: secretJEn3cx
3: t4k3nVdksE12
4: purplehorse1593vE1r
# 3 non mi dice molto. È una buona password, quindi il sale è irriconoscibile. Ma da # 1 e # 2 posso vedere che il sale è probabilmente 6 caratteri aggiunti alla fine. Posso usare quell'informazione per # 4 per capire che la password è purplehorse15
.
1 Nota: se memorizzi il salt e il nome utente / hash pass nello stesso DB, non ho nemmeno bisogno di indovinare cosa sia il sale. È proprio lì davanti a me. Il passo extra di indovinare il sale è necessario solo se il sale è memorizzato in qualche altro DB.