2010-07-11 11 views
5

Cuando alguien ha perdido una contraseña, hace clic en el enlace de contraseña perdida u olvidada. Tendrán que ingresar su dirección de correo electrónico, y luego responder su propia pregunta secreta si la pregunta secreta es correcta, se les enviará un correo electrónico con un enlace que caduca después de 24 horas.Revise mi diseño: instalación de restablecimiento de contraseña para el sitio web

A medida que se envió el correo electrónico, un registro se introduce en una tabla de base de la celebración de esta información: - el correo electrónico de la persona que necesita para restablecer la contraseña - la hora, que el restablecimiento de la contraseña caducará - la hora en que se presentó la solicitud de reposo de la contraseña.

El enlace enviado llevará al usuario a un formulario que le permite ingresar su nueva contraseña. En este formulario, deberán ingresar su dirección de correo electrónico y su contraseña X2.

Al hacer clic en enviar, se comprueba si el correo electrónico es válido (uno que la contraseña se restablece) y aún no ha expirado (comparando las dos fechas para ver si el tiempo de caducidad ha pasado, que es 24 horas)

Si el correo electrónico es válido, y aún no ha expirado, y las dos contraseñas coinciden con & cumplen con la req mínima, se aplica la nueva contraseña.

Aparece un mensaje de confirmación cuando tiene éxito.

Q1. ¿Es este un buen modelo para la recuperación de contraseñas? Q2. ¿Cómo puedo asegurarme de que el enlace que se envía a la dirección del usuario sea único? ¿En que nadie obtendrá el mismo enlace? Para que nadie pueda ir a la página de restablecimiento de contraseña y probar diferentes correos electrónicos, sino que cada cuenta que debe restablecerse tenga su propia URL única que funcione solo para esa cuenta.

En cuanto a la Q2:

Estaba pensando que cuando el usuario solicita que tienen su restablecimiento de contraseña, se genera un identificador único al azar y se almacena en el mismo registro que expira después de 24 horas. columna Esta aleatoria de identificador único que se podría llamar "deshacerse"

El enlace en el correo electrónico que se envía al usuario terminará con? rid = xxxxxxxxxxxxx

Cuando el usuario hace clic en Enviar en la página que se restablece el contraseña, el "deshacer" en la parte superior de la página se utiliza para obtener la dirección de correo electrónico correspondiente de la base de datos, para compararla con la dirección de correo electrónico en el formulario. Hacer esto puede garantizar que cada caso de restablecimiento de contraseña tendrá su propia URL única que ninguna otra cuenta puede usar para restablecer su contraseña.

¿Es esta una solución viable?

Cualquier contribución o sugerencia será apreciada.

Respuesta

2

Q1. En mi humilde opinión, hay un defecto. ¿Por qué le pides al usuario que ingrese una nueva contraseña? Prefiero generar una nueva contraseña aleatoria y enviársela. Después de recibirlo, el usuario puede iniciar sesión utilizando esta contraseña generada aleatoriamente y luego cambiarla en su perfil.

que sugieren el siguiente sistema, utilizado en la mayoría de los sitios web:

  1. El usuario introduce una dirección de correo en la "Restablecimiento de contraseña" forma.
  2. El correo está validado (es decir, ¿hay un usuario con esta dirección de correo en la base de datos?)
  3. La nueva contraseña se genera aleatoriamente y se envía por correo postal, se salatea/se almacena y se guarda en la base de datos.
  4. El usuario inicia sesión.

Es fácil y común, por lo que los usuarios no se perderán.

Ahora, se puede aumentar la seguridad (disminuir el abuso) por:

  • ajuste de la relación de restablecimiento de contraseña. Una vez que se envía el formulario, se recuerda la dirección IP y los datos enviados: ahora, durante unos minutos, nadie de la misma dirección IP podrá restablecer una contraseña.
  • Una contraseña recién generada no reemplaza a la antigua: en su lugar, se pueden usar ambas. Imagine que alguien restablece la contraseña de otro usuario. Este usuario aún debe poder iniciar sesión con la contraseña anterior, si no ha leído o recibido el correo con la nueva contraseña.

Por cierto, pero es sólo mi opinión personal, no proporcione la función de pregunta/respuesta secreta, a menos que sea necesaria. Me duele demasiado recordar lo que contesté, así que probablemente tendría más riesgo de olvidar la respuesta que la contraseña.

+0

+1: odio las preguntas secretas ... antes que nada, proporciono la respuesta y termino luego publicándola en Facebook en mi buzón de información, etc. Cosas como "apellido de soltera de mi madre" o "ciudad donde crecí" "es simplemente demasiado fácil de investigar". En segundo lugar, rara vez recuerdo la respuesta que proporcioné ... Básicamente, siento que socava la seguridad de tener una contraseña segura. Además, ya sabes que el correo electrónico es legítimo (ya que es con lo que se registró), ¿por qué no enviar un enlace de correo electrónico para restablecer, etc. – Adam

+2

¿Qué falla ves? Enviar una contraseña aleatoria que sea buena para un inicio de sesión, o un enlace aleatorio que sea bueno para un inicio de sesión tiene aproximadamente la misma seguridad. La principal ventaja del enlace es que el usuario simplemente puede ignorar las solicitudes de restablecimiento falsas. Si envía una contraseña aleatoria, deben tomar medidas (volver a cambiar la contraseña) para solicitudes falsas. Tampoco creo que tener dos contraseñas a la vez sea una buena idea. Eso aliviará los ataques de fuerza bruta, solo levemente, pero aún así. Siempre que el usuario controle su correo electrónico, no tiene que preocuparse por restablecimientos falsos. –

+0

@Matthew Flaschen: el error es que se solicita al usuario que ingrese una contraseña. Es bastante extraño para mí tanto como usuario como desarrollador. Como usuario, esperaría que me enviaran una nueva contraseña. Como desarrollador, no me gusta la idea de tener lo mismo dos veces: ¿tendría una verificación de seguridad con contraseña o un control de datos enviado en tres páginas (registro + perfil + cambio de contraseña)? Generar una contraseña aleatoria no aumentará el riesgo de fuerza bruta si la contraseña es lo suficientemente larga. Y lo que es malo con las solicitudes falsas no es una cuestión de seguridad, sino que el usuario se enojará si recibe demasiados correos. –

6

De manera óptima:

  1. a mensaje a través de OpenID. Menos complejidad de codificación, menos clics, menos tipeo, menos pérdida de tiempo.
  2. Hecho. La pregunta es discutible. Ya no es necesario preocuparse, alguien más ya resolvió este problema.

Hay mil millones de sitios implementando un billón de esquemas de autenticación y en el 99.999% de los casos es innecesario. ¿Por qué debería yo, como usuario, confiar en usted como desarrollador para no almacenar mi contraseña en texto sin formato o filtrarla o ser pirateado usted mismo? Pocas personas utilizan diferentes contraseñas para cada sitio ...

Si eso no es posible, a continuación, hacer que es tan libre de problemas como sea posible:

  1. hacer clic en un "olvidó la contraseña?" enlazar. Este automáticamente envía un correo si ya ingresé un correo electrónico (por ejemplo, después de un intento fallido de inicio de sesión). Si no he ingresado uno, simplemente oculte el campo de contraseña y dígame que lo haga. No volver a cargar o enviarme a una página diferente.
  2. Obtengo un enlace con algunas teclas (por ejemplo https://site.com/account/reset?key=a890ea8219175f890b7c123ee74a22). Algún hash único que está vinculado a mi cuenta y vence en tantas horas. Use SSL si es posible.
  3. Hago clic en el enlace y obtiene los detalles de mi cuenta con la clave, asegurándose de que sea válida y no haya expirado. Tecleo mi nueva contraseña dos veces. Ya sé cuál es mi dirección de correo electrónico, y usted ya sabe cuál es mi dirección de correo electrónico, y cualquier posible pirata informático también sabría cuál era mi correo electrónico, así que no me pida que lo escriba. Tener el enlace dura todo un día es excesivo. Aguarde el tiempo en una hora o menos.
  4. Odio la pregunta de seguridad. No me preguntes eso. Básicamente es solo una segunda contraseña que deliberadamente se hace menos segura para que siempre lo recuerdes. No tengo millas de viajero frecuente, no conozco el apellido de soltera de mi madre, etc. Detente. Sé que está ahí para mantener a raya a los extraños que puedan haber pirateado su correo electrónico, pero a menos que sea PayPal, creo que se trata de un exceso de ingeniería.
  5. Cuando haya confirmado que las contraseñas coinciden y son aceptables, actualice la base de datos (almacene solo un hash salado de mi contraseña, ¡no la contraseña en sí!) Y conécteme inmediatamente. Do not redirigirme a la página de inicio de sesión donde tengo que volver a escribir la información que ya te he dado varias veces (y aunque ya sabes que soy yo y confía en mí lo suficiente como para cambiar mi propia contraseña). Eso es muy molesto Los usuarios son impacientes.

También me gusta las contraseñas generadas aleatoriamente en base a lo siguiente:

  1. Por lo general, acabo de copiar y pegar la contraseña del correo de todos modos. Copiar y pegar una contraseña es algo que no desea que el usuario haga.
  2. Tengo que cambiar la contraseña manualmente, lo que significa perder el control en el panel de control del usuario o la configuración de la cuenta o lo que sea. Me estoy poniendo impaciente! Usted puede cachorrar con un "cambio de contraseña" en el momento en que inicie sesión con una contraseña de un solo uso, pero esto significa una mayor complejidad del código. Ahora necesita agregar una bandera para esto, agregar otra redirección, manejar el caso donde un usuario agota el tiempo al ingresar una nueva contraseña, etc.
  3. Porque soy solo humano, y los humanos tienen TDAH, por lo general me olvido de hacer más arriba y termino con una contraseña falsa que tengo que encontrar y copiar desde mi correo electrónico la próxima vez que necesite iniciar sesión también. Mi culpa, pero aún culpo a tu sitio por eso. ;-)

La solución de contraseña generada al azar también implica la mentalidad de que siempre usará una solución basada en contraseña, cuando la autenticación basada en enlaces parece ser el futuro (OpenID, etc.) en usabilidad y seguridad (no quiero que un centenar de sitios pequeños conozcan mis datos de inicio de sesión).

actualización para responder a comentar:

Por qué el hash debe ser lo suficientemente: si un hacker puede adivinar las 128+ trozos completos (por ejemplo) de su algoritmo de Hash generado (y dentro de una hora), entonces ¿Por qué no podría él o ella también adivinar el correo electrónico? Sé que "se siente" mucho más seguro pedir el correo electrónico y/o una pregunta de seguridad, pero si lo piensas bien, los correos electrónicos suelen ser muy predecibles y uniformes, con una baja tasa de entropía. Dudo que se pueda contar con que contengan más de 50 bits de información. (Probablemente mucho menos). Apuesto a que antes adivinaría su correo electrónico que un entero al azar de 50 bits. Pero si es una verdadera preocupación, todo lo que necesita hacer es agregar más bits al hash. 256 bits más o menos deberían hacerlo para el modo overkill - SHA256(salt, email, old pw hash, time stamp, maybe some bytes from /dev/urandom) o similar ... Si un hacker puede predecir eso, no hay mucho que puedas hacer realmente. Obviamente él tiene el control de The Matrix y podría proyectar su mente en los discos magnéticos dentro de sus discos duros si quisiera.

Aún Pro-OpenID: cualquier nuevo sitio que visito que la demanda se crea un usuario debe ser muy convincente de por qué quieren saber mi contraseña (desechable) y lo que me ofrecen en la seguridad de que OpenID o Google/Facebook/etc. no lo hace, o por qué no confían en Google/Facebook/etc. Nadie (que yo sepa) va por ahí recordando 30 contraseñas diferentes. Por lo general, las personas los reutilizan, por lo que si los creadores de sitios de terceros quisieran hacerlo, sería muy fácil para ellos estafar a sus usuarios. Si me inscribí en su sitio con mi información habitual, podría asumir de inmediato mis cuentas de Last.FM y Reddit si así lo deseaba, así como probablemente una docena de sitios que he usado un par de veces y que olvidé.De hecho, en estos tiempos modernos, un poco espero que los sitios sean ignorantes o tengan intenciones maliciosas si quieren detalles que estrictamente no necesitan, así que es por eso que lo llamo una contraseña desechable, con cada registro que se siente como lo que estoy diciendo "aquí, tengo mi cuenta de Reddit, es la misma L/P que usaré para su sitio (de lo contrario, me olvidaría). Está bien, no estoy especialmente apegado a ella de ninguna manera. " Por supuesto, Google podría en realidad hacerse cargo de todo de mi yo en línea si quisieran, pero por ahora confiaré en Google más que usted (¡sin ánimo de ofender!).

+1

No estoy de acuerdo con la solución OpenID. Desde la perspectiva de los usuarios, ingresar nombre de usuario y contraseña y hacer clic en "Enviar" es mucho más fácil que ser redirigido a otro sitio web, buscar la URL (WTF? ¿Por qué no puedo usar mi nombre de usuario corto y escribir esta URL larga?), Ingrese una contraseña, haga clic en "Enviar" y se le redirige de nuevo. –

+0

Mi único desacuerdo está en el paso 3. Debo confirmar que no solo robé esta URL o la encontré al azar (escribiendo mi nombre de usuario/correo electrónico). Eso elimina el riesgo de una "clave" débil o predecible. Y, +1 en OpenID, aunque también es una forma de "un correo electrónico ya en el archivo" - solo está autenticado con un tercero en lugar del usuario. –

+0

@MainMa: Es solo una implementación deficiente de la misma. Intente cerrar sesión en stackoverflow.com y vuelva a iniciar sesión. Para mí, solo es cuestión de hacer clic en un enlace único y me registra automáticamente (ya que ya estoy conectado con Google). ¡Así es como debería hacerse! – integer

2

En primer lugar, le sugiero que trate un restablecimiento de contraseña como una transacción comercial segura. SSL activado, y una sola solicitud es independiente de otras solicitudes para la misma cuenta. Genere una identificación de transacción aleatoria no reutilizable y asóciela con ESTA PETICIÓN ÚNICA para restablecer la contraseña. Luego, en el correo electrónico que envíe a ellos, incrustar el ID de transacción con la URL:

http://www.yoursite.com/passwordreset/?id=e3dXY81fr98c6v1

Esta llamada transacción de restablecimiento de contraseña debe estar asociada con la cuenta y haga que los metadatos asociados con una contraseña- restablecer, como la fecha de solicitud y la fecha de vencimiento. La cuenta en sí misma solo debe saber que hay restablecimientos de contraseña pendientes asociados.

Además, cuando un usuario le pide que restablezca su contraseña, olvide la pregunta secreta: es mucho más seguro enviarles un correo electrónico que YA debe tener en el archivo. (Si no lo hace, ¡comience a recopilarlos!). Mejor aún, use su dirección de correo electrónico como su nombre de usuario.

Cuando el usuario ingresa una nueva contraseña de esa URL de ID de transacción, confía en que es la persona que cree que es. Para garantizar esto, simplemente puede pedirles que vuelvan a ingresar su nombre de usuario (que ya han confirmado que están haciendo).

+0

Sí, SSL es una buena idea, se me olvidó mencionarlo. – integer

+0

Las preguntas y respuestas secretas estarán fuera. Ese correo electrónico al que se refiere debe estar ya en el archivo, ¿será el que tendrá la URL única? – Nich

+0

Sí. La dirección de correo electrónico en el archivo es la que recibe el enlace. –

Cuestiones relacionadas