Almacenamiento de NetworkCredential en la base de datos SQL

3

Tengo un proyecto web donde necesito almacenar un nombre de usuario y contraseña en una base de datos SQL. el nombre de usuario / contraseña son para servicios web de intercambio. (por lo que no se puede modificar, debo poder recuperar una contraseña de texto simple) Cada usuario de la página web deberá ingresar su nombre de usuario y contraseña una vez, y esta es la información que deseo para almacenar en la base de datos SQL, pero de alguna manera no es posible descifrarlo para otros, entonces el usuario inició sesión en la aplicación web (debido a problemas de seguridad) Estaba pensando que podría hacerlo utilizando la contraseña de los usuarios para la aplicación web para cifrar y descifrar la contraseña. De esta manera, solo puede descifrar la contraseña de intercambio si conoce la contraseña de usuario para la aplicación web. (que está recortado para esta aplicación web)

La aplicación web está usando la autenticación de formularios y los usuarios tienen la opción de "Recordarme" para que no tengan que iniciar sesión cada vez y el problema es este. Es posible que no reciba una solicitud con contraseña para cada nueva sesión. Los servidores de intercambio están fuera de nuestro control, por lo que no podemos usar ninguna suplantación, agregar usuarios con permisos especiales a los buzones de correo, etc. Lo único que sabemos sobre el servidor de intercambio es lo que obtenemos a través del servicio de detección automática de intercambio.

La única forma en que puedo pensar es crear una representación hash de la contraseña de los usuarios y guardarla en la cookie de autenticación. Luego puedo usar este hash (más algo de sal) para cifrar y descifrar la contraseña de los servicios web de intercambio.

¿Es esta una forma segura de hacerlo? ¿Hay alguna manera mejor de resolver este problema?

    
pregunta Mr Zach 23.10.2016 - 11:07
fuente

1 respuesta

2

No estoy seguro de si hay una mejor manera, pero así es como lo haría. Creo que es similar a lo que describe en la pregunta.

  • Almacene las credenciales de red encriptadas con una clave que se deriva de la contraseña de los usuarios, por ejemplo. utilizando PBKDF2). (Si también almacena hashes de contraseña para la autenticación, use un salt diferente para que no sean idénticos). De esa manera, si su base de datos está comprometida, las credenciales de la red seguirán siendo relativamente seguras.
  • Para que las credenciales de la red estén disponibles sin volver a ingresar la contraseña, las cifraría con una clave aleatoria y almacenaría el valor cifrado (pero no la clave) en una tabla aparte. La clave que enviaría como una cookie (con el tiempo de espera adecuado) al usuario. De esa manera, si su base de datos está en peligro, las credenciales de la red siguen siendo seguras porque la clave no está allí.
  • Tenga en cuenta que usaría una clave aleatoria criptográficamente segura, y no algo relacionado con el usuario, la contraseña o el ID de sesión.
  • Elimine las entradas de la tabla tan pronto como se agote el tiempo de la sesión o cuando un usuario cierre la sesión.

La parte trasera de esto es por supuesto que un usuario que puede robar la cookie puede descifrar las credenciales de la red. Pero esto será un problema para cualquier sistema en el que no se requiera el reingreso de la contraseña: cualquier persona que pueda robar la cookie de la sesión podría aparecer como si hubiera iniciado sesión. Así que creo que es un inconveniente que no requiere el reingreso de contraseñas, y no con esta solución en particular.

Disclaimar: Esta no es mi área de experiencia, por lo que es posible que desee una segunda opinión sobre este tema.

    
respondido por el Anders 23.10.2016 - 11:32
fuente

Lea otras preguntas en las etiquetas