Deberá almacenar la contraseña de correo electrónico del usuario en una forma recuperable. Aún puedes encriptar las contraseñas, pero no puedes hacerles hash.
El almacenamiento de las contraseñas de sus usuarios en forma recuperable conlleva algunos riesgos de seguridad. Si alguna vez se filtra la base de datos de contraseñas de usuarios, se produce una grave violación de la seguridad. Sin embargo, esa es la naturaleza de su servicio. La gente suele recomendar el hash para intentar mitigar este riesgo, pero como no puede usar el hashing de contraseñas en su aplicación en particular, tendrá que usar otras medidas para mitigar el riesgo.
Esta es mi recomendación sobre cómo hacerlo de la manera más segura posible. Configure una máquina separada (o VM) que se use únicamente con el fin de administrar las contraseñas de correo electrónico. Ejecuta un servicio, llamémoslo el servicio de mantenimiento de contraseñas, que expone algunas API simples:
-
Registrar cuenta IMAP. La persona que llama proporciona información sobre una cuenta de correo electrónico: por ejemplo, el nombre de usuario y la contraseña. El servicio de mantenimiento de contraseñas almacena esta información.
-
Leer correo electrónico. La persona que llama identifica una cuenta IMAP que se registró anteriormente con su servicio. El servicio de mantenimiento de contraseñas busca el nombre de usuario y la contraseña de esa cuenta IMAP, se conecta al servidor IMAP y se autentica, descarga cualquier correo electrónico nuevo y devuelve los mensajes de correo electrónico deseados a la persona que llama.
Este servicio de mantenimiento de contraseñas es como un Hotel California para las contraseñas de correo electrónico: las contraseñas se ingresan, pero nunca se abandonan. El servicio de mantenimiento de contraseñas es responsable de almacenar las contraseñas de la forma más segura posible, y nunca exponerlas a otros. Puede almacenar las contraseñas en una base de datos separada, cifrada bajo una clave especial. La clave de cifrado se puede almacenar en un archivo de configuración al que este servicio puede acceder, pero no a nadie más. El servicio de mantenimiento de contraseñas ahora puede controlar el acceso a las cuentas de correo electrónico de sus usuarios. Por ejemplo, puede realizar un registro seguro (para que pueda rastrear intrusiones), limitar la velocidad (para reducir el impacto de una violación de sus otros sistemas) u otras protecciones. También puede bloquear quién o qué puede acceder a él.
Ahora, escriba el resto de su sistema para que sea un cliente del servicio de mantenimiento de contraseñas. Configure el servicio de mantenimiento de contraseñas de modo que solo sea accesible para su código (y no para el público), y use una autenticación sólida para la conexión de su código con él. Asegúrese de no almacenar las contraseñas de correo electrónico de los usuarios en ningún otro lugar de su sistema. Cuando el usuario proporciona una contraseña de correo electrónico a su aplicación, debe invocar inmediatamente la API "Registrar cuenta IMAP" del servicio de mantenimiento de contraseñas, pasarla y eliminar todas las demás copias de la contraseña.
Esto no brindará una protección perfecta, pero le brinda un lugar para estar de pie: una forma de obtener la mayor protección posible para las contraseñas de sus usuarios. Con este tipo de enfoque y cierta diligencia, creo que puede proporcionar un nivel razonable de seguridad a sus usuarios.