Método de ofuscación de almacenamiento de contraseña reversible para credenciales de inicio de sesión de terceros

10

Tengo una aplicación empresarial interna que, como parte de su funcionalidad, se conecta a una aplicación de terceros utilizando credenciales de inicio de sesión específicas para el usuario de mi propia aplicación. Estas contraseñas se almacenan en una base de datos central. Actualmente, son de texto simple (esto se justificó en base a un alto nivel de seguridad de primera línea en nuestra LAN corporativa), pero un ataque reciente contra la red de nuestra nueva empresa matriz (afortunadamente no entraron) me ha llevado para echar otro vistazo a eso.

Contraseñas para la aplicación interna principal, podemos cifrarlas con un salt, no hay problemas allí. El problema es cifrar las credenciales de la aplicación de terceros. Como todos sabemos, a los usuarios les gusta mantener la misma contraseña para múltiples aplicaciones, así que no importa lo que haga con la contraseña interna de la aplicación para su custodia, no hará ninguna diferencia si las credenciales de terceros se encuentran allí en texto sin formato. justo al lado.

Aquí está el kicker; sea cual sea el método utilizado, debe ser reversible dentro de la aplicación , porque la aplicación de terceros # $% ^ & * requiere la transmisión de credenciales de texto sin formato del proceso de la aplicación interna a un servicio SOAP (afortunadamente, lo hace a través de HTTPS), y , la aplicación interna les permite a los usuarios mantener estas credenciales de terceros almacenadas (ahorrando al departamento de desarrollo la molestia de mantener el contenido de la base de datos). Entonces, lo mejor que puedo hacer es cifrar, no hash.

Entonces, me doy cuenta de que cualquier método que emplee aquí será menos que ideal; si el atacante obtiene tanto la aplicación como las credenciales, obtendrá las contraseñas de texto simple y no hay mucho en lo que pueda pensar para evitarlo. Solo estoy tratando de hacer que un atacante trabaje un poco más difícil para obtener las credenciales, con suerte dándome el tiempo suficiente para al menos alertar al tercero para que pueda inhabilitar nuestros inicios de sesión, si no forzar a cada usuario del sistema a cambiar su credenciales de terceros antes de que el atacante pueda descifrar una.

Entonces, ¿qué sugieres? AES (no puedo imaginar que RSA sea de mucha utilidad, ya que la aplicación tiene tanto para cifrar como para descifrar). ¿Algún truco inteligente para mantener la llave fuera del alcance de alguien que logra obtener tanto la base de datos como los binarios de la aplicación?

    
pregunta KeithS 17.10.2012 - 21:03
fuente

1 respuesta

11

Supongamos que en su aplicación (llamémosla App1), el usuario ya tiene que ingresar algunas credenciales C 1 (nombre y contraseña) que App1 usa cuando se conecta a su base de datos central. En este momento, su base de datos central contiene C 2 como texto simple, que se utilizará cuando App1 se conecte a App2.

Sea H () una función hash con una salida grande, digamos SHA-512. Cuando el usuario ingresa su contraseña (C 1 ) en la interfaz de App1, App1 calcula H (C 1 ) y obtiene un valor de 512 bits, que luego divide en dos mitades de 256 bits, P l y P r .

Las credenciales C 2 se cifran simétricamente con una clave derivada de P l . Esta derivación debe ser lenta (como bcrypt o PBKDF2 o algo equivalente); Sugiero confiar en un formato existente y bien auditado para los detalles de cifrado y la derivación de la clave, por ejemplo. OpenPGP . Llamemos a E (C 2 ) el resultado del cifrado.

Ahora deje que su base de datos central almacene E (C 2 ) y bcrypt (P r ).

Cuando el usuario ingresa C 1 en App1, App1 aplica H () para obtener P l y P r . Luego, App1 contacta con la base de datos central y envía P r (dentro de un túnel SSL, por supuesto). La base de datos central aplica bcrypt () en P r para ver si coincide con el valor almacenado; Si es así, envía E (C 2 ) de vuelta al cliente. Luego, App1 usa P l para descifrar el blob y obtener C 2 .

De esta manera, la base de datos central nunca obtiene el C 2 descifrado en absoluto; y C 2 son conocidos por App1 solo de forma transitoria (en la RAM, no "oculto" en el código). Lo que la base de datos central sabe es suficiente para probar la validez de una contraseña, pero se utiliza el hashing y el salado para contrarrestar ese problema (como parte de E () para P l , usando bcrypt () para P < sub> r ).

    
respondido por el Thomas Pornin 17.10.2012 - 21:46
fuente

Lea otras preguntas en las etiquetas