2009-02-07 19 views
49

Me pregunto cuál es el mejor método para crear una función de contraseña olvidada en un sitio web. He visto unos cuantos por ahí, aquí están unos pocos o combinación de:¿Olvidó su contraseña? ¿Cuál es el mejor método para implementar una función de contraseña olvidada?

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

¿Qué combinación o adición ¿Qué pasos añadirí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 con el principal de que no se puede recuperar la contraseña; se debe dar/generar una nueva contraseña.

Editar Me gusta lo que Cory dijo acerca de 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?

Respuesta

45
  1. Yo 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.

+13

La opción 1 también tiene la ventaja de no ser susceptible a los ataques DoS en el usuario. Por ejemplo, alguien constantemente hace clic en el enlace "restablecer contraseña" en la opción 2, por lo que el usuario está efectivamente bloqueado de su cuenta. Puedes protegerte contra eso, pero ¿para qué molestarse? La opción 1 es el camino a seguir ... –

+0

+1 para la rara instancia de sonido, consejos simples de seguridad. Buen trabajo. –

+0

¿Alguna razón por la cual el usuario no debe iniciar sesión una vez que establece una nueva contraseña? – Tommy

8

Enviar correo electrónico con una nueva contraseña.

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

Esto garantiza que la persona que desee la contraseña será la única que entre a la cuenta.

Si se olfatea el correo electrónico, alguien podría entrar 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 dice "gracias por cambiar la contraseña", van a estar bastante perplejos y hablarán con un administrador si no lo hicieron.

+0

IMO mala idea. El rastreador podría hacer mucho daño antes de que la verdadera persona pudiese ponerse en contacto con el servicio de atención al cliente. – user1069528

0

Opción 1. es no 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 han delineado los detalles.

+1

¿Cómo "adivina" fácilmente cadenas largas generadas aleatoriamente? – slikts

+0

Mi referencia 'Opción 1' ya no es clara con otras publicaciones; se refiere a la primera opción presentada por el OP. Se refería a la sugerencia de utilizar una 'pregunta secreta', que si se respondía correctamente podría ser cuestionada, como '¿a qué escuela secundaria asististe?'. Perdón por que esto no esté claro. – Jayden

1

El uso del enlace de verificación de correo electrónico/restablecimiento de contraseña le dará una mejor seguridad. Si mira a su alrededor, así es como lo hacen la mayoría de los sitios web y la gente está bastante acostumbrada a esta verificación, por lo que recomiendo usar este tipo de autenticación.

24

A pocos problemas de seguridad importantes:

  • Una pregunta/respuesta frase de contraseña en realidad disminuye la seguridad, ya que por lo general se convierte en el eslabón más débil en el 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 diversos motivos), 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, verifique Web Application Hackers Handbook. Es una excelente lectura sobre la creación de modelos de autenticación segura.

EDITAR:. En cuanto a la pregunta en su edición - Me gustaría sugerir:

"Un correo electrónico de solicitud de contraseña ha sido enviada a la dirección que proporcionó Si un correo electrónico no llega en breve , por favor revise su carpeta de correo no deseado. Si no llega el correo electrónico , entonces no existe una 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?

+4

¿no podría determinar si un correo electrónico ya se estaba utilizando al registrarse también? – corymathews

+1

Sí, aunque el mismo enfoque podría usarse para notificar a los usuarios existentes. Se aplican las mismas advertencias con el impacto a la facilidad de uso. –

1

Creo que (gbrandt's) Opción 2 sería un excelente 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 al ingresar su dirección de correo electrónico, también debe ingresar una fecha de nacimiento correcta (o cualquier otra) antes de restablecer la contraseña y enviar una nueva por correo electrónico.

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

En 5 o 7 malas direcciones de correo electrónico & combinaciones de fecha de nacimiento se le envía un correo electrónico al usuario que su contraseña ha sido solicitada para restablecerse y 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 hay demasiados usuarios en contacto con el webadmin con respecto a este correo electrónico él sabrá que alguien está tratando de alcanzar maliciosamente información de su página web/app)

¿Qué piensan ustedes?

-1

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.

He implementado 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, más lo valida cuando se usa.

hay explicación para todo (y si falta algo - que me haga saber ...)

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

Ver un Demo here.

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

+0

Eché un vistazo rápido a la fuente pero no pude ver el código que realmente hace el trabajo. Entonces me pregunté sobre el sha-256 en la configuración, ¿esto significa que las contraseñas son hash con un solo cálculo hash o es parte de un PBKDF2 iterado? ¿La sal realmente se deriva del nombre de usuario, en lugar de la fuente aleatoria del sistema operativo? ¿Cómo se almacena el código olvidado de la contraseña? ¿Se almacena solo como hash? – martinstoeckli

+0

las contraseñas se cifran utilizando un keystore + salt (el nombre de usuario). si el usuario olvidó su contraseña, no la recibe, sino que recibe un correo electrónico en su bandeja de entrada, por lo que nos aseguramos de que ÉL ES EL ÚNICO (su identidad). en el correo electrónico hay un enlace encriptado que lo lleva a la página "establecer nueva contraseña". Puedes probarlo en la demostración (el enlace a la demostración está arriba) – OhadR

+0

El flujo de trabajo se ve bien para mí, lo que me pregunto es cómo se calcula el hash, ¿o no usas un hash para almacenar contraseñas en este almacén de claves? Debería ser un algoritmo hash lento y adaptable como BCrypt o PBKDF2 para estar seguro. Entonces la sal idealmente debería ser realmente aleatoria, no derivada de otros parámetros. Cuando envié el formulario de contraseña olvidada, el marco envió un correo electrónico con un token que es bueno, aunque este token no debe almacenarse en la base de datos, solo se debe almacenar su hash. – martinstoeckli

Cuestiones relacionadas