Por qué usar la contraseña existente es incorrecto:
* Seguridad comprometida: Si puede usar la contraseña anterior para establecer una nueva, cualquier persona que obtenga acceso a esa capacidad (por ejemplo, un empleado deshonesto, un hacker que compromete su sistema) puede cambiar silenciosamente las contraseñas de los usuarios y hacerse cargo de las cuentas sin que el usuario lo sepa.
* Pérdida de responsabilidad: Si conoce la contraseña de un usuario, teóricamente podría realizar acciones como ese usuario. Esto hace imposible la auditoría y la responsabilidad. No puede probar que el usuario tomó la acción, ya que podría haberlo hecho usted mismo.
* Principios de almacenamiento de contraseña: Los sistemas modernos nunca almacenan contraseñas en texto sin formato. Están *hash *y a menudo *salados *. Incluso si * podría * obtener el hash almacenado, usarlo para establecer una nueva contraseña derrota el propósito del algoritmo de hash e introduce vulnerabilidades. Intentar revertir un hash es computacionalmente difícil y potencialmente imposible (¡diseñado de esa manera!), Pero dar acceso a la contraseña evita la seguridad.
La forma correcta de restablecer las contraseñas (incluso con el acceso de administrador):
Los métodos adecuados implican que el usuario inicie el proceso de reinicio, o un administrador que active un reinicio que * obliga a * al usuario a elegir una nueva contraseña al siguiente inicio de sesión.
1. Restablecimiento de contraseña iniciada por el usuario (autoservicio): Este es el método preferido.
* "Olvidó la contraseña de la contraseña": La mayoría de los sitios web y aplicaciones tienen un enlace de "contraseña olvidada" o "restablecimiento de contraseña".
* Verificación de correo electrónico: El usuario hace clic en el enlace, ingresa a su dirección de correo electrónico (o nombre de usuario), y el sistema les envía un correo electrónico con un enlace único y limitado a una página de restablecimiento de contraseña.
* Preguntas de seguridad/Opciones de recuperación: Menos común, pero aún válido:el usuario responde a las preguntas de seguridad que configuraron anteriormente o usa un método de recuperación predefinido (por ejemplo, un número de teléfono de recuperación).
* nueva entrada de contraseña: El usuario hace clic en el enlace, se lleva a una página donde puede ingresar y confirmar una nueva contraseña. Esta nueva contraseña se pone y almacena de forma segura.
2. Restablecimiento de contraseña iniciada por el administrador (forzando un cambio):
* Herramienta de panel de administración/línea de comandos: El administrador utiliza una herramienta con permisos adecuados para restablecer el * estado * de la contraseña, no para * establecer * una nueva contraseña directamente.
* Bandera para el cambio de contraseña: El sistema establece un indicador en la cuenta del usuario que los obliga a cambiar su contraseña la próxima vez que inicie sesión.
* Contraseña temporal (no recomendada): En * algunos * casos muy específicos (y * solo * si otras opciones no están disponibles), un administrador podría generar una contraseña * temporal *. El sistema * debe * Force El usuario la cambiará a una nueva contraseña inmediatamente después de su primer inicio de sesión con la contraseña temporal. Esta es generalmente una mala práctica porque:
* Requiere almacenar la contraseña temporal, incluso brevemente.
* Los usuarios no pueden cambiarlo de inmediato, aumentando el riesgo.
Detalles de implementación (variar por sistema/idioma):
El código exacto y los pasos dependen del lenguaje y el marco que está utilizando (por ejemplo, Python con Django, PHP con Laravel, Node.js con Express, etc.). Aquí hay un esquema general:
* backend (lado del servidor):
* Hashing de contraseña: Use un algoritmo de hash fuerte como BCrypt, Argon2 o Scrypt (no MD5 o SHA1, que se consideran rotos). Las bibliotecas están fácilmente disponibles para todos los idiomas principales.
* Generación de sal: Genere una sal única para cada contraseña. La sal es un valor aleatorio que se combina con la contraseña antes del hash. Esto evita los ataques de mesa del arco iris.
* Almacenamiento de contraseña: Almacene el * hash * y * sal * en su base de datos, nunca la contraseña de texto sin formato.
* Restablecer la generación del token: Cuando se solicite un reinicio, genere un token aleatorio único (por ejemplo, un UUID) y asocíelo con el usuario en la base de datos. Incluya una marca de tiempo para expirar el token después de un cierto período (por ejemplo, 1 hora).
* Envío de correo electrónico: Use una biblioteca o servicio para enviar correos electrónicos. Asegúrese de que sus correos electrónicos estén formateados correctamente y no parezcan spam.
* Validación de token: Cuando el usuario haga clic en el enlace de reinicio, valida el token en la base de datos, verificando que existe, no ha expirado y está asociado con el usuario correcto.
* Actualización de contraseña: Después de una validación exitosa, permita que el usuario ingrese una nueva contraseña, la hash con una nueva sal y actualice la base de datos. Invalidar o eliminar el token de reinicio.
* frontend (lado del cliente):
* Formularios seguros: Use HTTPS para cifrar la comunicación entre el navegador y el servidor.
* Medidor de fuerza de contraseña: Proporcione comentarios visuales al usuario sobre la fuerza de su contraseña.
* Campo de confirmación: Requiere que el usuario ingrese la nueva contraseña dos veces para evitar errores tipográficos.
Ejemplo (Python/Django conceptual):
`` `Python
Desde django.contrib.auth.hashers import make_password, check_password
de django.contrib.auth.models importador de usuario
importar uuid
Importar DateTetime
Def reset_password_request (correo electrónico):
intentar:
user =user.objects.get (correo electrónico =correo electrónico)
reset_token =uuid.uuid4 ()
user.profile.reset_token =reset_token # Suponiendo que tiene un modelo userprofile
user.profile.reset_token_expiry =DateTime.Datetime.Now () + DateTime.timedelta (Hours =1)
user.profile.save ()
# Enviar correo electrónico con RESET_TOWN
send_password_reset_email (user.email, reet_token)
Devolver verdadero
excepto el usuario.
devolver falso # o manejar el error adecuadamente
Def verify_reset_token (token):
intentar:
user =user.objects.get (perfil__Reset_token =token, perfil__Reset_token_expiry__gt =datetime.dateTime.now ()))
Return User
excepto el usuario.
no devuelve ninguno
def set_new_password (usuario, new_password):
user.password =make_password (new_password) # hash la nueva contraseña
user.profile.reset_token =ninguno # invalidar el token
user.profile.reset_token_expiry =Ninguno
user.profile.save ()
user.save ()
`` `` ``
Consideraciones de seguridad clave:
* https: Siempre use HTTPS para cifrar la comunicación.
* Limitando la velocidad: Implementar la limitación de la tasa para evitar ataques de fuerza bruta en el punto final de restablecimiento de contraseña.
* Vestimato del token: Establezca un tiempo de vencimiento razonable para los tokens de reinicio.
* Registro: Registre las solicitudes e intentos de restablecimiento de contraseña para fines de auditoría.
* Auditorías de seguridad regulares: Revise periódicamente su implementación de restablecimiento de contraseña para identificar y corregir posibles vulnerabilidades.
* Principio de menor privilegio: Otorgue solo los permisos mínimos necesarios a los administradores que pueden iniciar restablecimiento de contraseña.
En resumen, conocer la contraseña existente de un usuario debe * nunca * ser usado para restablecerla. Use los métodos seguros, iniciados por el usuario o iniciados por el administrador (forzando el cambio en el siguiente inicio de sesión) descritos anteriormente para proteger las cuentas de los usuarios y mantener un sistema seguro.