emailr_
Todos los artículos
usecase·9 min

Emails de restablecimiento de contraseña: mejores prácticas de seguridad

authsecuritytransactional

Resumen

Los emails de restablecimiento de contraseña son críticos para la seguridad. Usa tokens de vida corta y de un solo uso. Nunca incluyas contraseñas en el email. Envía de inmediato. Haz que el enlace de restablecimiento sea evidente. Notifica a los usuarios tras restablecimientos exitosos. Un flujo de restablecimiento comprometido implica cuentas comprometidas.

De todos los emails que envía tu aplicación, los de restablecimiento de contraseña son los de mayor riesgo. Si los haces mal, habrás creado una vulnerabilidad de seguridad que los atacantes explotarán. Si los haces bien, habrás construido un flujo de recuperación seguro y fácil de usar que genera confianza.

Los emails de restablecimiento de contraseña también están entre los más sensibles al tiempo. Un usuario bloqueado fuera de su cuenta está frustrado y ansioso. Cada minuto que espera el email de restablecimiento es un minuto en el que podría rendirse, contactar soporte o perder confianza en tu producto.

Fundamentos de seguridad

Los emails de restablecimiento de contraseña son un objetivo principal para atacantes porque proporcionan un camino hacia la toma de control de la cuenta. Tu flujo de restablecimiento debe ser seguro por diseño.

Nunca envíes contraseñas por email. Ni contraseñas temporales, ni generadas, ni nada. El email no es un canal seguro—puede ser interceptado, reenviado o accesible por cualquiera con acceso a la bandeja de entrada. Usa siempre un enlace de restablecimiento seguro que permita a los usuarios establecer su propia contraseña.

Los tokens de restablecimiento deben ser criptográficamente aleatorios e imposibles de adivinar. Usa el generador de números aleatorios seguro de tu plataforma, no valores previsibles como marcas de tiempo o IDs secuenciales. Un token debe tener al menos 128 bits de entropía.

Los tokens deben ser de corta duración. De 15 minutos a 1 hora es razonable. Ventanas de expiración más largas dan a los atacantes más tiempo para interceptar o adivinar tokens. Los usuarios que no restablezcan dentro de la ventana pueden solicitar un nuevo token.

Los tokens deben ser de un solo uso. Una vez que un token se use para restablecer una contraseña, invalídalo de inmediato. Esto evita ataques de repetición en los que un atacante utiliza un token interceptado después del usuario legítimo.

Almacena los tokens de forma segura. Aplica un hash a los tokens antes de almacenarlos en tu base de datos, igual que las contraseñas. Si tu base de datos se ve comprometida, los atacantes no deberían poder usar los tokens almacenados.

La experiencia de usuario

La seguridad y la usabilidad no son opuestas—un flujo de restablecimiento confuso deriva en tickets de soporte y atajos que crean sus propios problemas de seguridad.

Envía los emails de restablecimiento de inmediato. Los usuarios están esperando. Un email de restablecimiento que tarda 10 minutos en llegar parece roto. Prioriza los emails de restablecimiento en tu cola de envío—deberían salir en segundos.

Haz que el enlace de restablecimiento sea imposible de pasar por alto. Un botón grande y obvio que diga 'Restablecer contraseña' funciona mejor que un enlace de texto enterrado en un párrafo. Los usuarios están buscando la acción, no leyendo con detalle.

Mantén el email enfocado. No es momento para contenido promocional, enlaces sociales ni diseños elaborados. El usuario tiene un único objetivo: restablecer su contraseña. Todo lo demás es una distracción.

Incluye contexto sobre la solicitud. ¿Cuándo se solicitó? ¿Desde qué IP o ubicación? Esto ayuda a los usuarios a identificar si la solicitud fue legítima o si alguien más está intentando acceder a su cuenta.

Proporciona un camino claro si no solicitaron el restablecimiento. 'Si no solicitaste esto, puedes ignorar este email' es tranquilizador. Algunos usuarios recibirán emails de restablecimiento que no solicitaron (errores tipográficos, intentos maliciosos) y necesitan saber que están a salvo.

El flujo de restablecimiento

El flujo de restablecimiento completo tiene varios pasos, cada uno con implicaciones de seguridad:

La página de solicitud debería pedir solo una dirección de email. No confirmes si la dirección existe en tu sistema—esto filtra información a atacantes que intentan enumerar cuentas. Muestra siempre el mismo mensaje: 'Si existe una cuenta con este email, hemos enviado instrucciones para restablecerla.'

Limita la tasa de solicitudes de restablecimiento. Un atacante no debería poder inundar una dirección con emails de restablecimiento (acoso) ni probar muchas direcciones rápidamente (enumeración). Limita solicitudes por email y por IP.

La página de restablecimiento (a donde llegan los usuarios tras hacer clic en el enlace) debe validar el token antes de mostrar el formulario de contraseña. Si el token es inválido o ha expirado, muestra un error claro y permite solicitar uno nuevo.

Tras un restablecimiento exitoso, invalida el token, invalida todas las demás sesiones de esa cuenta (el usuario podría estar restableciendo porque sospecha un compromiso) y envía un email de confirmación notificando que su contraseña fue cambiada.

El email de confirmación es una función de seguridad. Si alguien más restableció la contraseña, el usuario legítimo verá este email y sabrá que su cuenta fue comprometida. Incluye información sobre cómo recuperar la cuenta si no fueron ellos.

Errores comunes

Incluso desarrolladores con experiencia cometen errores con los flujos de restablecimiento de contraseña:

Los tokens predecibles son sorprendentemente comunes. Usar el ID de usuario, el hash del email o la marca de tiempo como token (o parte de él) hace que los tokens sean adivinables. Usa siempre valores aleatorios criptográficamente seguros.

No establecer vencimiento de los tokens deja una ventana abierta indefinidamente. Si un usuario solicita un restablecimiento pero no lo completa, ese token no debería funcionar para siempre. Implementa expiración.

No invalidar los tokens tras su uso permite ataques de repetición. Una vez usado un token, no debería funcionar nunca más, incluso si aún no ha expirado.

Confirmar la existencia del email ayuda a los atacantes. Si tu página de restablecimiento dice 'no se encontró ninguna cuenta' para emails inválidos, los atacantes pueden usar esto para construir una lista de cuentas válidas. Muestra siempre la misma respuesta.

No notificar después del restablecimiento deja a los usuarios sin saber de un posible compromiso. El email de confirmación es un control de seguridad crítico, no solo algo deseable.

La entrega lenta frustra a los usuarios y los lleva a atajos inseguros. Si los emails de restablecimiento son lentos, los usuarios podrían intentarlo múltiples veces, contactar soporte para restablecimientos manuales o rendirse por completo. La velocidad importa.

El contenido del email

El propio email de restablecimiento debe ser simple y claro:

Asunto: Mantenlo directo. 'Restablece tu contraseña' o 'Solicitud de restablecimiento de contraseña' funciona. Evita tácticas de urgencia que parezcan phishing.

Remitente: Usa un nombre y dirección de remitente reconocibles. 'YourApp <[email protected]>' es mejor que '[email protected]'. Los usuarios deberían reconocer de inmediato de quién proviene el email.

Cuerpo: Explica lo que ocurrió ('Solicitaste un restablecimiento de contraseña'), proporciona el botón/enlace de restablecimiento, menciona la expiración ('Este enlace expira en 1 hora') y explica qué hacer si no lo solicitaron.

No incluyas el nombre de usuario ni otros detalles de la cuenta. Si el email es interceptado, no quieres dar a los atacantes más información de la necesaria.

Considera incluir el contexto de la solicitud (IP, ubicación, hora) para que los usuarios puedan verificar que la solicitud fue legítima. Pero equilibra esto con preocupaciones de privacidad—algunos usuarios no quieren su ubicación en un email.

Frequently asked questions

¿Cuánto tiempo deberían ser válidos los tokens de restablecimiento?

De 15 minutos a 1 hora es lo típico. Más corto es más seguro pero puede frustrar a quienes no revisan el email de inmediato. 1 hora es un equilibrio razonable para la mayoría de las aplicaciones.

¿Debería requerir la contraseña anterior para establecer una nueva?

No—el objetivo del restablecimiento es que el usuario no conoce su contraseña actual. El token de restablecimiento sirve como prueba de identidad. Exigir la contraseña anterior iría en contra del propósito.

¿Qué pasa si el email del usuario está comprometido?

El restablecimiento por email asume que la cuenta de email es segura. Si no lo es, el atacante puede restablecer contraseñas de cualquier cuenta vinculada. Considera ofrecer métodos alternativos de recuperación (SMS, códigos de respaldo, preguntas de seguridad) para aplicaciones de alta seguridad.

¿Debería iniciar sesión automáticamente a los usuarios después del restablecimiento?

Las opiniones varían. Iniciar sesión automáticamente es más conveniente, pero significa que cualquiera con el enlace de restablecimiento obtiene acceso. Exigir iniciar sesión después del restablecimiento agrega fricción pero garantiza que el usuario sepa que su nueva contraseña funciona. Para aplicaciones de alta seguridad, exige iniciar sesión.

e_

Escrito por el equipo de emailr

Construyendo infraestructura de email para desarrolladores

¿Listo para empezar a enviar?

Obtén tu clave API y envía tu primer email en menos de 5 minutos. No se requiere tarjeta de crédito.