Sto progettando un sistema utente reg / auth per un sito web e ho creato questo design per l'autenticazione basata su password.
Mi piacerebbe sapere se questo è ragionevole. (ignorando i cookie per le credenziali di memorizzazione nella cache, oauth, ecc.)
Alcune cose che ho incorporato nel design, ma non sono sicuro di quanto "aiutino" la sicurezza:
-
nel caso in cui il server db sia compromesso, hashedPw viene inviato dal client in modo che saltedSecret possa essere riverificato. (hashedPw non è memorizzato sul server)
-
challenge (chalSecret) per impedire l'attacco di riproduzione
-
il costo di scrypt è regolabile nel tempo, ma poiché mi aspetto di usare un'implementazione javascript di scrypt nei browser forse non è una funzionalità così grande.
Un'altra domanda è se posso facilmente proteggere l'invio iniziale di saltedSecret durante la registrazione dell'utente, ma suppongo che l'utilizzo di HTTPS sia sufficiente per farlo.
Se ci sono modi in cui posso semplificarlo, faccelo sapere.
NOTA: leggi la sezione di modifica sottostante per le modifiche che semplificano questo design.
ModificaAlcunecosechemisonovenutedopoaverpostatoquesto:
TLS protegge dagli attacchi di replay , quindi posso rimuovere l'intera sezione della sfida. - sul lato server, dovrei (almeno) memorizzare un hash del saltedSecret. la cosa migliore è conservarne uno scrypt. Questo ha un buon effetto collaterale nel rimuovere il requisito dell'utente di inviare hashedPw durante il login.
- Nuovo diagramma con queste modifiche: