Attualmente stiamo lavorando su una nuova applicazione server che sta per comunicare con le applicazioni client su molti sistemi diversi. Per questo abbiamo voluto implementare un nuovo schema di hashing delle password.
Ho svolto alcune ricerche, inclusa la lettura di molte domande su security.SE e crypto.SE, sull'hashing delle password. Dopo questa ricerca sono arrivato al seguente schema di hashing:
Utilizzeremo PBKDF2
come algoritmo di hashing. La scelta per questo risiede principalmente nel fatto che sia disponibile direttamente in .NET Framework. Ho esaminato sia bcrypt
che scrypt
, ma poiché entrambi hanno bisogno di librerie di terze parti, siamo andati con PBKDF2
.
Con l'uso di PBKDF2
c'è anche il sale libero che ottieni quando generi un hash per la prima volta.
La domanda quindi era come salvare i dati nel database. Avevamo due opzioni:
- Salva ciascun valore separatamente, ad esempio hash, salt, iterations e algoritmo.
- O salvalo come una singola stringa.
Siamo andati con il valore della singola stringa che appare come segue:
<algorithm>$<iterations>$<salt>$<hash>
Questo è simile a come, ad esempio, Django lo fa.
L'ho implementato in questo modo e ho scritto una relazione con le nostre scelte e argomenti. Ma ora ho domande sul design. Per esempio alcuni si chiedono perché il sale sia così chiaramente salvato, non sarebbe meglio combinare il sale e l'hash in una singola stringa per renderlo meno ovvio agli aggressori.
Di solito questi casi fanno presupposizioni in cui gli utenti malintenzionati hanno solo il database e così via. Mentre sostengo che dovremmo sempre considerare lo scenario peggiore e assumere che gli hacker abbiano sia il codice che il database. Sostengo anche che il sale è lì per annullare l'effetto delle tabelle arcobaleno e tabelle di ricerca. E il numero di iterazioni è l'attacco di forza bruta deterrente.
Ma poiché non sono un professionista della sicurezza, quello che dico può essere facilmente ignorato (anche se questo vale per qualsiasi argomento su Internet;)).
Pertanto, ho bisogno di tutto ciò che può dimostrare che ciò che abbiamo creato è un modo corretto di farlo.
Ho appena implementato un sacco di cose che ho trovato su internet, ma non ho alcuna prova (scientifica) che sia sufficiente.