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
- Un administrador activa un restablecimiento de contraseña para un usuario en el sistema.
- 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.
- El sistema envía un enlace al correo electrónico conectado al usuario que tiene su contraseña activada para el restablecimiento.
- El usuario hace clic en el enlace, que está sobre https, y el sistema lee el identificador.
-
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
-
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.
- 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.
- 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?