it-swarm-es.com

¿Alguien puede proporcionar referencias para implementar los mecanismos de restablecimiento de contraseña automática de la aplicación web correctamente?

Estamos implementando el restablecimiento de contraseña automática en una aplicación web, y sé cómo quiero hacerlo (URL de restablecimiento de contraseña limitada por tiempo de correo electrónico a la dirección de correo electrónico registrada previamente de los usuarios).

Mi problema es que no puedo encontrar referencias para señalar a los desarrolladores que utilicen esa técnica. ¿Alguien puede señalarme en la dirección de algunas buenas referencias sobre esta técnica?

96
bdg

Algunas sugerencias:

No restablezca la contraseña del usuario hasta que se confirme. No restablezca de inmediato la contraseña del usuario. Solo reinícielo una vez que el usuario haga clic en un enlace de confirmación enviado a su dirección de correo electrónico previamente registrada.

Requerir un CAPTCHA. Cuando un usuario solicita que se restablezca su contraseña, obligarlos a resolver un CAPTCHA antes de continuar. Esto es para evitar que las herramientas automatizadas intenten causar dolor a muchos usuarios y obligar al usuario a demostrar que son humanos (no un robot).

Aleatoriedad. La URL de restablecimiento de contraseña por tiempo limitado debe incluir un componente aleatorio, no cuestionable. Asegúrese de usar aleatoriedad de calidad criptográfica. La salida de /dev/urandom O System.Security.Cryptography.RNGCryptoServiceProvider Sería una buena opción. El resultado de Rand() o random() o System.Random No es lo suficientemente aleatorio y sería una mala elección. A GUID o la marca de tiempo no es lo suficientemente aleatoria y no sería una buena opción.

Incluya un límite de tiempo. El enlace de confirmación de reinicio debe caducar después de un tiempo razonable: digamos, 24 horas. El enlace debe ser utilizable solo una vez, y debe expirar inmediatamente tan pronto como se use.

Incluir texto explicativo en el correo electrónico. Es posible que desee agregar un texto explicativo al correo electrónico, para explicar por qué se envió el correo electrónico, en caso de que alguien solicite un restablecer para una cuenta que no es la suya. Puede incluir un texto como "Alguien ha solicitado que se restablezca la contraseña de su cuenta username en site. Si realizó esta solicitud, haga clic aquí para cambiar su contraseña. Si no lo hizo esta solicitud, haga clic aquí para cancelar la solicitud ".

Enviar correo electrónico después de restablecer la contraseña. Una vez que la contraseña se haya restablecido correctamente, envíe un correo electrónico al usuario para informarle que la contraseña ha sido modificada. No incluya la nueva contraseña en ese correo electrónico.

Monitorear cancelaciones. Puede considerar incluir alguna lógica para monitorear la frecuencia con la que los usuarios hacen clic en el enlace de cancelación que indica que no solicitaron un reinicio. Si esto supera un cierto umbral, puede ser útil enviar una alerta a los operadores del sistema. Además, si se visita un enlace de cancelación para alguna solicitud ¡después se visita el enlace de confirmación, eso es una indicación potencial de un ataque contra ese usuario; es posible que desee tomar medidas en ese punto, por ejemplo , invalide la contraseña del usuario y solicite que restablezca su contraseña nuevamente. (Esta es una defensa contra el siguiente ataque: el atacante obtiene acceso al buzón del usuario, luego solicita que se restablezca su contraseña en su sitio, luego visita el enlace de confirmación. Si el atacante no elimina estos correos electrónicos de la bandeja de entrada del usuario, luego, cuando el usuario real lee su correo electrónico, puede hacer clic en el enlace de cancelación, lo que le da una indicación de posibles problemas).

Use HTTPS. El enlace debe usar https (no http :), para protegerse contra varios ataques (por ejemplo, ataques Firesheep a usuarios que navegan la web desde Internet café).

Registre estas operaciones. Sugiero registrar todas esas solicitudes. Además de registrar el nombre de usuario del usuario, es posible que desee registrar la dirección IP del cliente que solicitó que se le envíe un enlace de restablecimiento por correo electrónico, así como la dirección IP del cliente que visitó el vínculo de restablecimiento.

Lectura adicional. También puede leer la excelente publicación de blog de Troy Hunt, Todo lo que siempre quiso saber sobre la construcción de una función de restablecimiento de contraseña segura . Gracias a @coryT por un enlace a este recurso.

Por último, considere la autenticación sin contraseña. Las contraseñas tienen muchos problemas como mecanismo de autenticación, y puede considerar otros métodos de autenticación de usuarios, como el almacenamiento seguro cookie persistente en su máquina con un secreto innegable para autenticarlos. De esta manera, no hay una contraseña para olvidar y no hay forma de que el usuario sea phishing, aunque debe proporcionar una forma para que un usuario autorice el acceso desde una nueva máquina o un nuevo navegador (posiblemente por correo electrónico al usuario previo Dirección de correo electrónico registrado). Este documento de encuesta tiene una excelente encuesta de muchos métodos de autenticación de reserva y sus fortalezas y debilidades.

93
D.W.
15
coryT

Cualquier lugar que pueda enviarle una contraseña significa que no tiene la contraseña, sino que la almacena donde de alguna manera se puede descifrar como 'texto plano'. Esto en sí mismo es malo.

Probablemente no sea "la mayoría" segura, pero más segura sería:

A solicitud de contraseña, envíe un enlace de restablecimiento de contraseña al usuario con GUID incorporado. La sesión en GUID expira en, hmm, hora más o menos.

9
Rich Homolka

Bien, entonces su pregunta es, ¿cómo debe estructurar el proceso de recuperación de contraseña/cuenta? Eso dependerá de lo que desee optimizar: experiencia de usuario sin problemas o buena seguridad.

Si desea una buena seguridad:

  • Durante el registro, el usuario debe ingresar su dirección de correo electrónico.
  • Durante el registro, el usuario debe ingresar un canal secundario para la autenticación: número de teléfono móvil o pregunta y respuesta de desafío (es decir, " cuál es el nombre de soltera de su madre " o mejor).

  • Durante la recuperación, su sistema primero obtiene una verificación aproximada de la identidad por medio del canal secundario anterior: la pregunta de desafío, o enviando un código por SMS al teléfono móvil, o similar.

  • Cuando se borra la primera verificación de identidad anterior, el sistema envía un correo electrónico de restablecimiento de contraseña ¡solo a la dirección de correo electrónico ingresada previamente. Esta es una medida adicional importante para evitar f.x. exploits tipo Sarah Palin .

  • El correo electrónico ¡no debe contiene una nueva contraseña o similar. Debe tener un enlace que permita hacer clic en una página web encriptada HTTPS en su sitio que a) está vinculada a la cuenta a través de un valor secreto no adivinado proporcionado en la URL, b ) tiene un límite de tiempo, por lo que la recuperación de la cuenta solo funciona durante x horas después de que se solicitó, c) proporciona una manera para que el usuario final cree un ¡nuevo contraseña.

  • Tenga un buen inicio de sesión en todas las transacciones de restablecimiento de cuenta, y haga que un ser humano realmente las controle y actúe si parecen sospechosas (mire los registros del servidor para las direcciones IP fx, muchas solicitudes provienen de la misma dirección IP, ¿hay casos en que el usuario está intentando restablecer las contraseñas de un país diferente del propietario de la cuenta registrada, etc.).

También puede evitar esta complejidad por completo: Todavía es temprano, pero OAuth/OpenID/inicie sesión a través de Facebook, Google, etc. elimina esta complejidad por completo de sus sistemas, pero con un quizás una usabilidad menos establecida .

9
Jesper M

La forma más segura de realizar un restablecimiento de contraseña es generar un token de restablecimiento único, aleatorio y grande, con una fecha de caducidad, vinculada a la ID de usuario. El token debe estar en hash en la base de datos, ya que un atacante con acceso a SQL podría usarlo para restablecer contraseñas arbitrarias de usuario.

Se debe enviar un enlace de restablecimiento a la dirección de correo electrónico, que contiene el token de restablecimiento. Cuando el usuario hace clic en el enlace, se debe encontrar el hash del token en la base de datos y verificar la fecha de vencimiento en el futuro. Si se cumplen estas condiciones, se debe presentar al usuario una pantalla que le permite escribir una nueva contraseña.

Todo este proceso debe hacerse a través de SSL, de lo contrario, un atacante podría oler la URL y restablecer la contraseña antes que el usuario.

Algunos otros consejos:

  1. El secreto cuestiona una molestia menor para los atacantes y una molestia importante para los usuarios. Evítalos por completo.
  2. Presente al usuario un desafío de verificación humana (por ejemplo, un CAPTCHA) antes de enviar el restablecimiento de la contraseña. Esto evita las solicitudes de reinicio automatizadas.
  3. Compruebe si la dirección IP que realiza el restablecimiento es una que ha iniciado sesión correctamente en la cuenta anteriormente. Si no es así, solicite más detalles sobre la cuenta/usuario, p. año de creación de cuenta, fecha de nacimiento, primera línea de dirección.
  4. Agregue un enlace "No solicité este correo electrónico", para que los usuarios puedan informar solicitudes de restablecimiento de contraseña erróneas.
6
Polynomial

Otro que puede o no ser apropiado para su aplicación, pero que se usa en aplicaciones de banca en línea y cosas similares es enviar la mitad del código de reinicio por SMS mensajes a un teléfono móvil registrado. Desde la perspectiva de un atacante, este es un PITA completo, ya que requiere el compromiso de un par de canales para romper.

6
Rory Alsop

Autenticación de 2 factores a través de SMS! 1 conoce al cliente y su número de teléfono móvil, SMS ellos un código único para agregar al sitio web para validarlo son ellos: )

0
frank

Hazlo en unos pocos pasos. Por ejemplo algo como esto:

  1. El usuario olvida su contraseña. Hace clic en el botón "Olvidé mi contraseña, envíeme un correo electrónico sobre qué hacer a continuación" (la etiqueta del botón puede variar;))
  2. Su servidor le envía un enlace www.yourdomain.com/lostpassword?param_1=x;param_2=y
  3. Hace clic en el enlace y puede crearse una nueva contraseña
  4. Hace clic en enviar. Todo hecho. Todo el mundo está feliz

Una y única captura está en el punto 3). Los valores X e Y deben ser aleatorios, impredecibles y estar conectados a esta cuenta en particular. También deben usarse una sola vez y deben volverse obsoletos después de un corto período de tiempo (¿24 horas?). Almacene ambos valores en una tabla dedicada con las columnas correspondientes:

| some_id | user_id | X | Y | expire_time

Si un usuario intenta utilizar el enlace adecuado, compruebe si no se cumple el tiempo de caducidad y, de lo contrario, permítale cambiar la contraseña.

0
Andrzej Bobak