security md5 application-design forgot-password

security - ¿Cuál es el mejor método para "olvidar mi contraseña"?



md5 application-design (17)

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

Estoy programando un sitio web de la comunidad.

Quiero crear una función "Olvidé mi contraseña".

Al examinar diferentes sitios, descubrí que emplean una de tres opciones :

  1. envíe al usuario un correo electrónico con un enlace a una URL única y oculta que le permite cambiar su contraseña (Gmail y Amazon)

  2. enviar al usuario un correo electrónico con una nueva contraseña generada al azar (Wordpress)

  3. enviar al usuario su contraseña actual (www.teach12.com)

La opción n. ° 3 parece ser la más conveniente para el usuario, pero dado que guardo contraseñas como un hash MD5, no veo cómo la opción n. ° 3 estaría disponible para mí, ya que MD5 es irreversible . Esto también parece ser una opción insegura , ya que significa que el sitio web debe guardar la contraseña en texto claro en alguna parte, y al menos la contraseña de texto sin cifrar se envía por correo electrónico inseguro al usuario. ¿O me estoy perdiendo algo aquí?

Entonces, si no puedo hacer la opción n. ° 1, la opción n. ° 2 parece ser la más simple de programar ya que solo tengo que cambiar la contraseña del usuario y enviársela. Aunque esto es algo inseguro, ya que debe tener una contraseña en vivo que se comunica a través de correo electrónico no seguro. Sin embargo, esto también podría ser mal utilizado por los que causan problemas para molestar a los usuarios escribiendo correos electrónicos aleatorios y cambiando constantemente las contraseñas de varios usuarios.

La opción n. ° 1 parece ser la más segura, pero requiere un poco de programación adicional para manejar una URL oculta que caduca, etc., pero parece ser lo que utilizan los grandes sitios.

¿Qué experiencia has tenido al usar / programar estas diversas opciones? ¿Hay alguna opción que me haya perdido?


Las opciones 1 y 2 son tan inseguras entre sí.

Ahí. Lo dije. Si se ha violado la cuenta de correo electrónico del usuario, no hay una forma segura y razonable de hacer las cosas a menos que recopile más datos privados, como su dirección, el apellido de soltera de su madre, todos los cuales se pueden adivinar.

La mejor (aunque más molesta) versión que he visto es donde necesitas recordar una pregunta secreta y una respuesta secreta. Significa que el usuario debe recordar qué pregunta hicieron, que, por supuesto, siempre puede olvidarse también.

Si olvidan la pregunta y usted es una empresa "real", siempre existe la opción de enviar al usuario un token a través de la publicación, con instrucciones sobre cómo restablecer toda su seguridad ... Es muy poco probable que un pirata informático tenga acceso a su correo de la vida real.

Un inconveniente en eso sería recolectar un número de teléfono cuando el usuario creó la cuenta. Si eso existiera y no pudieran recordar ninguno de sus detalles, podría configurar algún tipo de sistema de llamadas automático que les indicara cómo restablecer sus detalles.

Y una cosa para mencionar sobre el n. ° 2: no permita que el proceso sobrescriba la contraseña de la cuenta actual. Si eso sucediera, alguien podría decir que olvidó la contraseña de cualquier cuenta, lo que desencadenó muchos cambios de contraseña no deseados.


4) Acreditar su cuenta bancaria con dos cantidades aleatorias y pedirles que ingresen las de.
5) Snail les envía una nueva contraseña y les pide que ingresen.
6) Pídales que envíen un mensaje de texto o que llamen a algún número e ingresen algún valor a un número de teléfono con el teléfono móvil que registraron en el archivo.
7) Salga completamente del problema de administración de contraseñas externalizándolo a proveedores de OpenID como , Facebook, motores de blogs y otros que están empezando a hacer.

Fuera de esos, use la opción n. ° 1 o n. ° 2 con la función adicional de que ambos caducan en una hora.


Cualquiera de las opciones 1 o 2 estaría bien. Como dijiste, la opción 3 es insegura, ya que necesitarías almacenar la contraseña de texto claro. Probablemente te guste y uses un algoritmo de encriptación reversible para almacenar / recuperar la contraseña, pero con mejores alternativas disponibles para ti no hay razón para seguir ese camino.


Estoy de acuerdo con sus comentarios acerca de que la opción n. ° 3 es insegura.

En cuanto a la programación de # 1 o # 2, la opción # 2 es más fácil de programar, pero la # 1 no es mucho más difícil y ambas son probablemente tan seguras entre sí.

Cualquiera que sea la opción que elija, también puede considerar hacerla más segura al incluir solicitudes de información personal (que obtiene durante el registro) como parte del proceso de contraseña olvidada.

He programado sistemas en los que tiene un nombre de usuario y para obtener una nueva contraseña debe ingresar tanto su nombre de usuario como su dirección de correo electrónico. Puede recibir un recordatorio de su nombre de usuario pero el punto principal es que alguien probablemente no podrá adivinar su nombre de usuario y su correo electrónico, pero si lo hace solo por correo electrónico, es menos seguro.

Las preguntas secretas son un acercamiento a la parte de información personal. Personalmente creo que no ofrecen mucho valor ya que las personas tienden a elegir preguntas que mucha gente sabrá la respuesta, podrá adivinar o podrá descubrir. Sin embargo, es mejor que nada, siempre que lo use junto con un método que ya es relativamente seguro.

Obviamente, cuanto más haces, más trabajo de programación es.

El método más simple es:

  1. Tener un enlace "recordarme mi nombre de usuario" (ingrese el correo electrónico). No le digas al usuario si se envió o no un correo electrónico porque las personas pueden usarlo para averiguar si una dirección de correo electrónico es de un miembro. Siempre dígale al usuario que verifique en su bandeja de entrada el correo electrónico de recordatorio, pero solo envíelo si alguien es miembro; y
  2. Requiera el nombre de usuario y el correo electrónico para recibir una nueva contraseña de un solo uso. Esa contraseña solo debería durar una hora más o menos. Cuando el usuario lo usa, se los debe forzar a cambiar su contraseña de inmediato.

Estoy sorprendido con las votaciones alternas en las respuestas que describen # 1 y # 2 como equivalentes. Ellos no están en absoluto. Enviar al usuario un enlace a corto plazo para cambiar su contraseña es el enfoque más conveniente, más utilizado y más seguro que no implica una interacción fuera de banda (correo, mensaje de texto, etc.). Algunas razones:

  1. Establecer una contraseña temporal a través de un enlace de contraseña olvidada permite a los usuarios cambiar efectivamente la contraseña de un usuario y bloquear a un usuario fuera de su cuenta si conocen el inicio de sesión del usuario. Con un enlace, el usuario simplemente sabe que alguien está jugando y su acceso no se ve afectado.
  2. El enlace de restablecimiento de contraseña solo es válido por un período corto, por lo que hay una ventana muy pequeña para que un atacante la golpee. E incluso si lo hicieran, el usuario sabría porque el enlace de restablecimiento ya no funcionaría si el atacante interceptara el enlace y lo usara para cambiar la contraseña. Si el usuario no cambia la nueva contraseña asignada inmediatamente, el atacante que la haya interceptado puede suplantar al usuario de forma silenciosa por tiempo indefinido . Entonces, la gran diferencia es que, mientras un hacker puede interceptar el correo electrónico de restablecimiento de contraseña, si usa el enlace para cambiar la contraseña del usuario, el usuario sabrá que algo está mal porque el enlace no funcionará y generará otro restablecimiento de contraseña. solicitud.
  3. Más fácil de usar: el usuario simplemente hace clic en un enlace en su correo electrónico en lugar de escribir una nueva contraseña aleatoria que haya generado.

Y las preguntas de seguridad a menudo hacen que un sitio sea menos seguro, no más: son otro vector de ataque y, a menudo, el eslabón más débil. Recomiendo leer The Web Application Hacker''s Handbook para una excelente discusión sobre este tema.


Existe una opción adicional que puede usar en combinación con cualquiera de las opciones que menciona:

Puede dejar que el usuario escriba un recordatorio de su contraseña, que le envíe como primer paso cuando haya olvidado la contraseña. Si el recordatorio no ayuda al usuario, puede pasar a la siguiente opción.

Como el recordatorio no es la contraseña en sí, es seguro enviarlo por correo (o tal vez incluso mostrarlo directamente en la página).


Indique al usuario que venga personalmente a sus oficinas y demuestre su identidad con una tarjeta de identificación o pasaporte.

Esto, por supuesto, asume que tiene oficinas cerca de sus usuarios y que la cuenta es lo suficientemente valiosa como para justificar este procedimiento. Adecuado para bancos de ejemplo.


Intenté un par de métodos con los que realmente no estoy contento. Lo que me he decidido para el próximo proyecto es:

  1. El usuario ingresa nombre de usuario y dirección de correo electrónico
  2. Correo electrónico enviado con un enlace que contiene url y guid param que se almacenó en db con 48 horas de vencimiento
  3. El usuario confirma la contraseña para restablecer
  4. La nueva contraseña se envía por correo electrónico al usuario
  5. El inicio de sesión con una nueva contraseña muestra un mensaje o redirecciones para cambiar la página de contraseña.

La opción n. ° 1 es probablemente la mejor. # 3 es inseguro (y también sugiero usar algo más fuerte que MD5, como SHA1). La opción n. ° 2 no es buena porque permite que cualquier persona al azar lo excluya de su cuenta hasta que verifique su correo electrónico, a menos que use una pregunta de seguridad. Y las preguntas de seguridad a menudo son más fáciles de descifrar que las contraseñas.


La opción n. ° 1 tiene un par de ventajas principales sobre el n. ° 2. Si un usuario aleatorio escribe mi dirección de correo electrónico en el cuadro "He olvidado mi contraseña", mi contraseña no se restablecerá. Además, es un poco más seguro ya que no hay un registro permanente de la contraseña del sitio almacenada en su bandeja de entrada de Gmail para siempre.

Una pieza fundamental que falta aquí es que el enlace que proporcione en el n. ° 1 solo debería funcionar para restablecer una contraseña y tener un límite de tiempo

Todas estas soluciones significan que está tratando su bandeja de entrada de correo electrónico como el "anillo único" que las gobierna a todas. La mayoría de los servicios en línea parecen estar haciendo esto hoy en día de todos modos.

Mi enfoque preferido es ir con Openid cuando sea posible. La administración de contraseñas es un infierno que nadie parece hacer bien. Es más fácil entregar este problema a otra persona.


Lea el top 10 de OWASP para asegurarse de que su método cumpla con los requisitos.

Here está el enlace directo.


No existe una diferencia real entre la seguridad de la opción 1 o 2. Opción 1 es efectivamente lo mismo que precargar la nueva contraseña en el formulario.

De hecho, con la prevalencia de los ataques de phishing, uno podría argumentar que alentar el uso de la opción 1 con URL largas podría hacer que la gente esté menos alerta sobre hacer clic en largas URL misteriosas.


Opción 4: solicitar al usuario que restablezca la contraseña ingresando su nombre de cuenta Y dirección de correo electrónico. Mientras no revele nombres o direcciones de correo electrónico reales en el sitio (¿POR QUÉ lo haría en este día y edad?), Este es un método razonablemente seguro e inviolable. Envíe un enlace a una página de reinicio, no la contraseña en sí.

Opción 5: use OpenID y pase la responsabilidad a un tercero para que se preocupe por ello.

Honestamente, esto es mucho más esfuerzo de lo que requieren la mayoría de los sitios. Por mi parte, ME GUSTA recibir contraseñas de texto plano por correo electrónico porque las almaceno en una carpeta de "registros" en mi bandeja de entrada. De esa forma puedo buscar contraseñas para los sitios cuando los olvido (¡lo cual sucede mucho!). Si alguien está leyendo mi correo electrónico, me preocupan más los problemas que las personas que usan mi cuenta de Twitter (si tuviera una). Por supuesto, los bancos y las empresas tienen requisitos más estrictos, pero no especificó cuál es su sitio. Esa es la clave para la mejor respuesta.


Podría hacer una mezcla entre # 1 y # 2, tomando ventajas de ambos:

Envíe al usuario un correo electrónico con un enlace a una URL única y oculta que le permita cambiar una nueva contraseña generada aleatoriamente.

Esa página podría ser SSL, y la contraseña podría caducar en 12-24 horas.


Si los has hasheado, la Opción 3 no está disponible y, si no los has usado, lástima de ti. :)

Prefiero la opción 1, enviando un enlace de restablecimiento de contraseña enviado a su correo electrónico que les permite (por un tiempo limitado) restablecer su contraseña. Requiere más trabajo, pero es fácil de usar y, en última instancia, tan seguro como el proceso de inicio de sesión de correo electrónico.


Solo una nota rápida sobre algo no específicamente en relación con su pregunta. Mencionaste que usaste MD5 para hash contraseñas almacenadas. Independientemente de si elige usar las Opciones 1 o 2 (3 será la menos segura, por razones obvias), MD5 es un algoritmo de hashing crackeado, y puede hacer que sea bastante fácil para los hackers obtener acceso a las cuentas protegidas por Hashing MD5.

Puede leer más sobre la vulnerabilidad en la siguiente URL: en.wikipedia.org/wiki/MD5

Una mejor solución hash sería algo así como SHA, que sigue siendo un algoritmo de hashing estable y seguro. Combinado con la opción n. ° 1 o n. ° 2, debe tener un sistema razonablemente seguro para proteger las contraseñas de sus usuarios, salvo para los hackers más decididos.


Tenga en cuenta que la Opción # 2 también requiere que realice un seguimiento de la contraseña anterior y expire la nueva contraseña aleatoria si no se usa dentro de, por ejemplo, 24 horas.

De lo contrario, podría molestarte al repetidamente emitir una nueva contraseña aleatoria: si no estás cerca de tu correo electrónico, es posible que no sepas por qué no puedes ingresar con tu contraseña normal.

Además, evite requerir una "pregunta de identificación". Las respuestas a estas preguntas suelen ser mucho más fáciles de adivinar que las contraseñas reales, para que todos puedan identificarse como yo. Vea la historia de Sarah Palin para un ejemplo reciente de cuán insegura es esta.