Olvidé mi contraseña: ¿cuál es el mejor método para implementar una función de contraseña olvidada?

Me pregunto cuál es el mejor método para crear una función de contraseña olvidada en un sitio web. He visto bastantes por aquí, aquí hay algunos o una combinación de:

  • frase de respuesta pregunta / respuesta (1 o más)
  • envía un correo electrónico con una nueva contraseña
  • en pantalla da nueva contraseña
  • confirmación por correo electrónico: debe hacer clic en el enlace para obtener una nueva contraseña
  • página que requiere que el usuario ingrese una nueva contraseña

¿Qué combinación o pasos adicionales agregarías a una función de contraseña olvidada? Me pregunto cómo solicitan la nueva contraseña y cómo terminan obteniéndola.

Estoy operando en el director que la contraseña no puede ser recuperada; se debe dar / generar una nueva contraseña.

Editar Me gusta lo que Cory dijo sobre no mostrar si el nombre de usuario existe, pero me pregunto qué mostrar en su lugar. Creo que la mitad del problema es que el usuario olvidó qué dirección de correo electrónico usaron, lo que es útil para mostrar algún tipo de mensaje de “no existe”. Alguna solución?

  1. Personalmente, enviaría un correo electrónico con un enlace a una página a corto plazo que les permite establecer una nueva contraseña. Haga que el nombre de la página sea una especie de UID.
  2. Si eso no le atrae, entonces enviarles una nueva contraseña y forzarlos a cambiarla en el primer acceso también lo haría.

La opción 1 es mucho más fácil.

Algunas cuestiones importantes de seguridad:

  • Una pregunta / respuesta de frase de contraseña en realidad reduce la seguridad, ya que normalmente se convierte en el eslabón más débil del proceso. A menudo es más fácil adivinar la respuesta de alguien que una contraseña, especialmente si las preguntas no se eligen cuidadosamente.
  • Suponiendo que los correos electrónicos funcionen como el nombre de usuario en su sistema (que generalmente se recomienda por una variedad de razones), la respuesta a una solicitud de restablecimiento de contraseña no debe indicar si se encontró una cuenta válida. Simplemente debe indicar que se ha enviado un correo electrónico de solicitud de contraseña a la dirección provista. ¿Por qué? Una respuesta que indica que un correo electrónico existe / no existe permite que un pirata informático recopile una lista de cuentas de usuario enviando múltiples solicitudes de contraseñas (generalmente a través de un proxy HTTP como burp suite) y señalando si se encuentra el correo electrónico. Para protegerse de la captura de inicio de sesión, debe asegurarse de que ninguna función relacionada con inicio de sesión / autenticación proporcione ninguna indicación de cuándo se ha ingresado el correo electrónico de un usuario válido en un formulario de inicio de sesión / reinicio de pase.

Para obtener más información, consulte el Manual de piratas informáticos de la aplicación web . Es una excelente lectura sobre la creación de modelos de autenticación segura.

EDITAR : Con respecto a la pregunta en su edición, sugeriría:

“Se ha enviado un correo electrónico de solicitud de contraseña a la dirección que proporcionó. Si no llega un correo electrónico en breve, revise su carpeta de correo no deseado. Si no llega ningún correo electrónico, no aparecerá ninguna cuenta con el correo electrónico que proporcionó”.

Aquí se realiza una compensación entre la facilidad de uso y la seguridad. Debe equilibrar esto según el contexto: ¿es la seguridad lo suficientemente importante para usted y sus usuarios como para justificar este inconveniente?

Enviar correo electrónico con una nueva contraseña

FORCE un cambio de contraseña cuando llegue e ingrese la nueva contraseña.

Esto asegura que la persona que desea la contraseña será la única que ingrese a la cuenta.

Si se olfatea el correo electrónico, alguien puede ingresar a la cuenta (por supuesto), pero la verdadera parte lo descubrirá de inmediato (ya que la contraseña que acaba de enviar no funciona).

También envíe confirmaciones de cambios de contraseña a los usuarios.

Si alguien obtiene la nueva contraseña, y luego un correo electrónico que diga “gracias por cambiar la contraseña”, se quedarán perplejos y hablarán con un administrador si no lo hicieron.

Usar el enlace de verificación de correo electrónico / restablecimiento de contraseña le dará una mejor seguridad. Si miras a tu alrededor, así es como lo hacen la mayoría de los sitios web y las personas están bastante acostumbradas a esta verificación, por lo que te recomiendo usar este tipo de autenticación.

Creo que (gbrandt’s) Opción 2 sería un gran método si se combina con cierta información personal que ya tienes para el usuario. es decir, fecha de nacimiento.

Cuando el usuario solicita una nueva contraseña (restablecer) ingresando su dirección de correo electrónico, también debe ingresar una fecha de nacimiento correcta (o alguna otra cosa) antes de que se restablezca la contraseña y se envíe una nueva por correo electrónico al usuario.

¡Solo aquellos que lo conocen bien pueden molestarlo al restablecer su contraseña! No puede ser un extraño o un bot

Después de 5 o 7 malas combinaciones de dirección de correo electrónico y fecha de nacimiento, se le envía un correo electrónico al usuario que solicita que se restablezca su contraseña y que ha fallado debido a una credencial incorrecta. Entonces el restablecimiento de contraseña para esa cuenta se suspende durante 24 horas o cualquier período deseado.

(Si demasiados usuarios se ponen en contacto con el webadmin con respecto a este correo electrónico él sabrá que alguien está tratando de obtener información maliciosamente desde su sitio web / aplicación)

¿Qué piensan ustedes?

La opción 1. no es una buena idea, ya que generalmente es fácil de adivinar por los demás. El correo electrónico personal de Sarah Palin (Yahoo, creo) fue pirateado de esta manera por un tercero.

Las otras opciones son mejores y las publicaciones anteriores describen los detalles.

La idea en la que estaba pensando era firmar los datos en el enlace que se envía al usuario. Luego, cuando el usuario hace clic en el enlace y el servidor recibe la llamada, el servidor también obtiene la parte cifrada y puede validar que los datos no se tocaron.

Implementé un proyecto JAVA para este caso de uso. Está en GitHub, código abierto. Responde a su pregunta perfectamente … implementado en Java.

En cuanto al enlace en el correo electrónico , genera el enlace y lo valida al usarlo.

Hay una explicación para todo (y si falta algo, házmelo saber …)

Eche un vistazo: https://github.com/OhadR/Authentication-Flows

Vea una demostración aquí .

Esta es la aplicación web del cliente que usa auth-flows, con el README con todas las explicaciones. te dirige la implementación: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows