Attualmente ho il seguente set-up per la gestione degli utenti che hanno dimenticato la loro password.
- Un utente digita il suo indirizzo e-mail e preme il pulsante della password dimenticata.
-
Ricerco l'utente che appartiene a quell'indirizzo e-mail e memorizzo una nuova "richiesta di password dimenticata" nel database. L'elemento di richiesta della password dimenticata ha il seguente aspetto:
Guid ForgotPasswordRequestId; Guid UserId; DateTime ValidUntil;
-
Genero un token per identificare la richiesta di password dimenticata convertendo la guida di ForgotPasswordRequest su una stringa Base64. Il Guid è una guida di versione 4 (casuale, non basata sul tempo o sull'indirizzo MAC). Controlla questo link MSDN per le note sull'implementazione.
-
Creo un link come
www.example.com/account/ForgotPassword?token=TOKEN
che viene inviato all'utente in una e-mail. -
Ogni volta che qualcuno visita quel link entro 24 ore, può impostare una nuova password per quell'account.
Penso che le probabilità che qualcuno indovini il token è piccola poiché Guid è un numero di 122 bit (128 bit, meno 6 bit per le informazioni sulla versione). Quindi un hacker avrebbe bisogno di provare, in media, token (2^122 / 2)
entro 24 ore prima di riuscire. Se la mia matematica è corretta, questo è 3 * 10^31
token al secondo, che sono sicuro che il mio server non può gestire;). Anche il token che devono indovinare non è in alcun modo correlato all'utente per il quale desidera reimpostare la password.
Tuttavia, è corretto generare il token direttamente da un Guid generato? Esiste comunque un modo per utilizzare un Guid e non un generatore di numeri casuali sicuro per rendere un attacco fattibile? C'è qualche altro problema in questo schema che lo rende non sicuro?
Ho visto questa domanda, sebbene il suo relativo non spiega le migliori pratiche per generare il token.