¿Es seguro el enfoque de Django para restablecer los tokens de contraseña?

6

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é?

    
pregunta Angular noob 27.06.2015 - 21:20
fuente

1 respuesta

3

Como con cualquier pregunta de "es X seguro", la respuesta será, en cierta medida, "que depende de sus requisitos exactos desde el punto de vista de seguridad, las amenazas a las que se enfrenta, el tipo de aplicación y el entorno que utilizará. desplegar en "

Sin embargo, con esta advertencia en el camino, diría que el esquema descrito anteriormente parece relativamente razonable desde el punto de vista de la seguridad y es definitivamente mejor que muchas de las funciones de restablecimiento de contraseña que he visto en el pasado.

El informe de errores que vinculó describe un escenario muy específico (el atacante tiene acceso de lectura a secciones específicas del código y la configuración del lado del servidor, pero no a otro acceso) que, si bien representa un riesgo, es realmente marginal ( para mí) como si tuvieran ese acceso, probablemente haya otras cosas que atacarían antes de que comiencen a generar enlaces de restablecimiento de contraseña falsos para los usuarios.

Los comentarios del hilo de HN son de naturaleza más general y no parecen desprestigiar una amenaza específica para este esquema más allá de la inquietud general de Thomas con los esquemas que evitan el enfoque estándar que describe en su comentario. Si bien sus puntos son razonables, eso no quiere decir que el esquema de Django se haya roto, más que hay concesiones involucradas.

    
respondido por el Rоry McCune 27.06.2015 - 23:16
fuente

Lea otras preguntas en las etiquetas