Nella mia applicazione Spring, stavo programmando di rimuovere le password dal processo di autenticazione inviando un "link di accesso magico" all'indirizzo e-mail di un utente. Tuttavia, in questa domanda Rob Winch (responsabile di Spring Security) dice quanto segue:
Fai attenzione a sapere cosa stai facendo in termini di consentire l'accesso da un collegamento all'interno di un'e-mail. SMTP non è un protocollo sicuro e quindi è in genere male fare affidamento su qualcuno che ha una e-mail come forma di autenticazione.
È davvero così? In tal caso, come è più sicuro l'invio di un collegamento per la reimpostazione della password? L'accesso utilizzando un collegamento magico non equivale a inviare un collegamento magico per ripristinare una password?
Un collegamento magico da solo non è necessariamente negativo. Un valore del tutto casuale a 512 bit non sarà più facile da indovinare di una chiave privata a 512 bit. In generale si considera buona pratica farli scadere dopo un ragionevole lasso di tempo. Un buon approccio, che evita anche di dover archiviare le voci del database, è quello di incorporare i dati del token nell'URL e firmarli con una chiave privata. Cioè.
site.com/login?type=login&user=[username]&expires=[datetime]&sig=[signature of other parameters].
Tuttavia, l'e-mail come meccanismo di trasmissione non è sicura.
Per impostazione predefinita, SMTP offre pochissima protezione contro l'intercettazione. Il traffico può essere crittografato tra server ma non ci sono garanzie. Anche con la crittografia è ancora spesso possibile gestire la connessione nel mezzo (la crittografia non è la stessa dell'autenticazione).
In tal caso, come è più sicuro l'invio di un collegamento per la reimpostazione della password?
Non lo è. Questo è il motivo per cui diversi servizi richiedono ulteriori prove prima di inviare il link (o dopo averlo fatto clic).
Ci sono tre problemi qui.
If invii i link con un token di accesso segreto con e-mail, quindi dovrebbero essere monouso e scadere piuttosto rapidamente.