Estoy implementando una función restablecimiento de contraseña para una aplicación web y estoy considerando adoptar una implementación similar a Django .
En pocas palabras, Django crea un token que consta de una marca de tiempo y un hash de la marca de tiempo y la ID de usuario. Este hash es un HMAC y se usa para verificar que ni la marca de tiempo ni la ID de usuario se han manipulado.
Además de la marca de tiempo, la información sobre el usuario, como su contraseña saltada, se encuentra en hash. De esta manera, si el usuario cambia su contraseña, el token se volverá inválido, reduciendo la ventana de oportunidad para un atacante.
El código fuente del generador de token se puede ver aquí Y aquí está el pseudocódigo:
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
Este parece como una buena solución para mí. Los sitios web que ejecutan Django han estado haciendo esto desde 2008 o así, y no puedo encontrar ningún informe de una vulnerabilidad.
Hice una investigación y a alguien en Hacker News no le gustó este enfoque. También hay un par de tickets sobre el tema que expresan preocupación. Sin embargo, todavía tengo que encontrar una razón específica para que esto sea inseguro.
¿Es este un método seguro para generar tokens de restablecimiento de contraseña? Si no, ¿por qué?