Sto sviluppando una struttura web personale, niente internetty, e probabilmente nemmeno nulla che possa mai andare sulla mia LAN personale. E alla ricerca di consigli sulle password, le persone sembrano raccomandare solo quelle librerie nel titolo. Lo sto facendo per imparare la sicurezza da una prospettiva di sviluppo, e di nuovo, sono consapevole che questa non è la miglior pratica che voglio imparare implementandola da sola (e infastidendo la comunità con domande incessanti).
Attualmente la mia routine fa 4096 colpi di SHA512 salato (un numero strappato dal nulla - I'll concedere che è una cosa che probabilmente hanno ordinato) in questo modo:
string randomdatabasesalt = "whateverdatabasesalt"
user = "username"
string password = "whateverpassword"
for (int i = 0; i < 4096; i++)
{
password = SHA512(user + randomdatabasesalt + password);
}
store (user, password);
Ora, se ne avrò bisogno in un secondo momento, potrò aggiungere altri round all'hash di tutti (pre-violazione ovviamente) e potrò rafforzarlo senza che nessuno debba reimpostare le password, tutte ragionevolmente facilmente. Oppure, se lo SHA2 si rompe completamente per quanto riguarda la velocità di cracking, posso ripassare quegli hash e aggiungerlo alla routine senza che nessuno sia più saggio, ma potrebbe essere uno spreco indesiderato di cicli. Quindi, che cosa c'è di sbagliato in questo approccio, a parte la scelta casuale e calcolata dei round? E 'solo la mancanza di revisione tra pari o fare le librerie di cui sopra fare qualcosa che non sto prendendo in considerazione?
Domanda secondaria, aggiungerei i sali che ogni passaggio in qualche modo indebolisce l'hashing? È meglio salare solo l'hash iniziale quindi passare attraverso? Esempio:
string password = "whateverpassword"
password = SHA512(user + randomdatabasesalt + password);
for (int i = 0; i < 4095; i++)
{
password = SHA512(password);
}
store (user, password);