¿Cómo almacenar las contraseñas de forma segura en mi servidor?

10

Exención de responsabilidad : Sé que debo usar bcrypt para almacene con seguridad las contraseñas de los usuarios . Por favor, sigue leyendo.

Quiero almacenar credenciales para varios servicios de correo electrónico para cada usuario. Entonces, si inicio sesión con mi nombre de usuario y contraseña (que está correctamente hash), entonces puedo acceder a varios correos electrónicos, incluyendo 2 @hotmail, 1 @gmail, my university one y varios más a través de imap. Estoy usando imap para leer los correos electrónicos, que requieren el correo electrónico y la contraseña en texto sin formato. Entonces, ¿cómo almaceno estas contraseñas de forma segura?

Lo que he pensado:

  • Algunos servicios ofrecen una API. Úsalos siempre que sea posible.

  • Cifre las credenciales de cada usuario con sus contraseñas de inicio de sesión, de modo que solo un usuario que conozca sus detalles de inicio de sesión podrá descifrar sus credenciales y acceder a los correos electrónicos. No estoy seguro de cómo hacer esto correctamente, así que aquí es donde necesito ayuda. Usaría mcrypt_encrypt() de PHP con MCRYPT_RIJNDAEL_256 .

  • Solicite la contraseña cada vez que el usuario inicie sesión. No es práctico si el usuario tiene más de 2 servicios conectados.

TL; DR

¿Cómo almaceno las contraseñas en una base de datos para poder usarlas con imap más adelante?

    
pregunta Francisco Presencia 22.06.2014 - 16:46
fuente

2 respuestas

6

Te enfrentas al problema que enfrenta cada administrador de contraseñas. Creo que su solución es usar un algoritmo simétrico para cifrar los datos confidenciales, y usar una contraseña maestra para cada usuario para derivar una clave de descifrado para todas sus contraseñas guardadas. Esta contraseña maestra deberá ingresarse cada vez que se reinicie su script / aplicación o, en el caso de una aplicación web, cada vez que el usuario inicie sesión.

Esto es básicamente lo que describe en su segundo punto. La herramienta criptográfica que necesita es PBKDF2 : use esto en la contraseña de inicio de sesión del usuario cuando se ha enviado. La clave resultante debe ser adecuada para cifrar / descifrar las contraseñas en la base de datos usando MCRYPT_RIJNDAEL_256 .

En una nota al margen: ¡asegúrate de usar diferentes vectores de inicialización cada vez que cifres datos nuevos!

    
respondido por el executifs 23.06.2014 - 13:31
fuente
1

Podría considerar la implementación de su propio entorno de SSO (aviso que no dije para "rodar el suyo").

Uno a quien he contribuido personalmente es el Servicio de Autenticación Central de Jasig ( enlace ) que sirve como plataforma de autenticación centralizada para sus usuarios. para iniciar sesión en. Entonces, sus aplicaciones "cliente" deberían estar "CASeadas" (integradas) con CAS para que autorice el acceso del usuario si ya ha sido autenticado por este software de terceros.

En relación con su pregunta, el componente al que contribuí fue su extensión ClearPass ( aquí ) que, mientras aumenta El riesgo de seguridad, como en cualquier aplicación que utiliza el cifrado sobre hash, le permite obtener credenciales de texto claro ( aquí ).

  

Propósito (ClearPass) : para habilitar el inicio de sesión único en alguna aplicación heredada, puede ser necesario proporcionarles la contraseña de texto simple. Si bien este enfoque aumenta inevitablemente el riesgo de seguridad, varias instituciones consideraron que es un "mal necesario".

Al completar con éxito la transacción ClearPass, terminará con el nombre de usuario y la contraseña del usuario. Tenga en cuenta que estas serían las credenciales de inicio de sesión de la aplicación del usuario; lo que el usuario utiliza para iniciar sesión en su aplicación que maneja la autenticación a servicios de correo electrónico de terceros en su nombre .

Con las credenciales de inicio de sesión en mano, puede volver a solicitar la contraseña de su aplicación a través de ClearPass una y otra vez para descifrar las contraseñas de servicio a pedido que originalmente cifró con su contraseña de inicio de sesión para solucionar los problemas del "Administrador de contraseñas" descritos por @executifs. El almacenamiento de la contraseña de la aplicación del usuario es manejado por ClearPass, encriptado por EncryptedMapDecorator y almacenado en la memoria (o en memcached, etc.).

Como nota al margen, aquí hay una página wiki rápida sobre la implementación de crypto No hace mucho tiempo, cuando estaba trabajando con encriptación y ClearPass (y sí, se ha enviado a ## crypto en Freenode para criticarlo en masa y revisado según sea necesario) en caso de que ayude.

Para el código real, aquí hay algunos ejemplos en Java , Node. , y sí, incluso C # . Tenga en cuenta que los dos últimos son esencialmente mis puertos de EncryptedMapDecorator.java con respecto a la Derivación de clave basada en contraseña (derivando una clave secreta basada en su frase de contraseña), Vector de inicialización (bytes aleatorios seguros) e incluso empaquetado. Después de estudiar los recursos que he descrito aquí, y estos ejemplos de código, debe tener los conocimientos suficientes para poder trasladar esto a PHP, o al menos comenzar de todos modos :)

Espero que algo de esto ayude!

    
respondido por el rdev5 25.06.2014 - 19:18
fuente

Lea otras preguntas en las etiquetas