Sto implementando una funzione reimpostazione della password per un'applicazione web e sto pensando di adottare un'implementazione simile a Django .
In poche parole, Django crea un token che comprende un timestamp e un hash del timestamp e l'ID utente. Questo hash è un HMAC e viene utilizzato per verificare che né il timestamp o l'ID utente siano stati manomessi.
Oltre al timestamp, le informazioni sull'utente come la sua password salt vengono sottoposte a hash. In questo modo, se l'utente cambia la sua password, il token diventa non valido, riducendo la finestra di opportunità per un utente malintenzionato.
Il codice sorgente per il generatore di token può essere visualizzato qui ed ecco lo pseudocodice:
function make_token(user)
timestamp = current timestamp (now)
value = timestamp + user.id + user.password
hash = create_hmac("some secret", value)
return timestamp + ":" + hash
function check_token(user, token)
timestamp = token.split(":")[0]
hash = token.split(":")[1]
if timestamp is after expiration date
return false
value = timestamp + user.id + user.password
comparate = create_hmac("some secret", value)
// if the hash has changed, the token has been tampered with or the user has
// changed their password.
if hash != comparate
return false
return true
Questo sembra mi piace come una buona soluzione. I siti Web che eseguono Django lo fanno dal 2008 o giù di lì e non riesco a trovare alcuna segnalazione di vulnerabilità.
Ho fatto qualche ricerca e qualcuno su Hacker News non ha gradito questo approccio. Ci sono anche un paio di biglietti sull'argomento che esprimono preoccupazione. Tuttavia, devo ancora trovare una ragione specifica per cui questo potrebbe essere insicuro.
Si tratta di un approccio sicuro alla generazione di token di reimpostazione della password? In caso negativo, perché?