Implementando el restablecimiento de la contraseña en una aplicación web mediante token de correo electrónico

2

Creo que tengo una comprensión básica de los problemas de seguridad, pero siento que si no lo sé todo, implementaré malas soluciones. A continuación se muestra mi estrategia actual; ¿He pasado por alto las mejores prácticas obvias?

He leído Can ¿Alguien ha proporcionado referencias para implementar correctamente los mecanismos de restablecimiento automático de contraseñas de las aplicaciones web? y piensa que tengo las partes relevantes cubiertas.

Flujo

  1. Un administrador activa un restablecimiento de contraseña para un usuario en el sistema.
  2. El sistema bloquea al usuario del sistema, genera una cadena alfanumérica aleatoria de 40 caracteres como un identificador, y almacena este hash en la base de datos con SHA1, junto con el nombre de usuario cifrado, se creó la hora y el hash de Contraseña anterior. Si el usuario tiene tokens de autenticación anteriores en la base de datos, los elimina.
  3. El sistema envía un enlace al correo electrónico conectado al usuario que tiene su contraseña activada para el restablecimiento.
  4. El usuario hace clic en el enlace, que está sobre https, y el sistema lee el identificador.
  5. El sistema lo vuelve a hacer con SHA1, busca en la base de datos:

    • El identificador de autenticación no coincide: página de error. %código%
    • El authtoken se creó hace más de 4 horas: Please contact admin
    • El identificador de autenticación se encuentra y está activo: Ir a 6
  6. El cliente recibe un diálogo para seleccionar una nueva contraseña y publica la nueva contraseña con el mismo identificador (en un campo oculto) de nuevo en el servidor.

  7. El sistema verifica de nuevo que exista authToken, que esté activo y que la contraseña no sea la misma que la anterior. Si tiene éxito, el sistema descifra el nombre de usuario almacenado junto con el authtoken, cambia la contraseña de este usuario al nuevo, desbloquea al usuario y elimina el authToken de la base de datos.
  8. El sistema redirige al usuario a la página de inicio de sesión.

Entonces

El único agente que desencadena el proceso de restablecimiento es un administrador autenticado: no hay problema con los usuarios bloqueados de manera malintencionada. Toda la comunicación entre el cliente y el servidor se realiza a través de HTTPS, con la posible e incontrolable excepción de la solución de correo electrónico del usuario.

Así es como se genera el authToken:

const string authtokenAlphabet =  abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ1234567890_-.";
const int authtokenSize = 40;
var authToken = string.Empty;

while (authToken.Length < authtokenSize)  
    authToken += authtokenAlphabet[_random.Next(0, authtokenAlphabet.Length - 1)];

Aunque uso la clase Please contact admin , que no se recomienda debido a una aleatoriedad menor que la óptima, ¿sería esto realmente un problema considerando que solo un administrador autorizado y autenticado puede activar el reinicio?

    
pregunta Alex 05.06.2014 - 09:22
fuente

1 respuesta

1
  • En 1 ¿Este activador está protegido de XSRF?
  • En 2 , ¿está bloqueando la cuenta de usuario durante 4 horas? Eso es un DOS

  • En 6 estás usando un generador aleatorio débil. Si alguien descubre esto, puede generar authToeksn para cualquiera.

  • nunca mencionó cómo está cifrando los nombres de usuario? Piense en la capacidad de cifrar un nombre de usuario e inyectarlo en authToken . Esto llevará a cambiar la contraseña de username en su sistema, incluso si ese username no solicitó que se establezca una nueva contraseña.

  • También tenga en cuenta que authToken es del cliente. La regla de seguridad básica es nunca confiar en nada que venga del cliente, así que asegúrate de que desinfectes estos tokens correctamente desde sqli, slqi, etc. ¡Esto también se aplica al new-password !

respondido por el AK_ 09.06.2014 - 01:19
fuente

Lea otras preguntas en las etiquetas