Cómo vincular la clave de cifrado para iniciar sesión si hay varios usuarios

2

Escenario:

Los usuarios A, B, C necesitan acceder a datos encriptados desde una aplicación web. Todos ellos acceden a los mismos datos.

La clave de cifrado debe estar vinculada a su inicio de sesión para que no se almacene en el servidor.

Pregunta: ¿Es posible vincular la clave con sus datos de inicio de sesión incluso si todos tienen un nombre de usuario / contraseña diferente? ¿Cuál es el mejor enfoque en este escenario?

    
pregunta IMB 06.09.2016 - 23:35
fuente

2 respuestas

4

En general, las soluciones que hacen esto funcionan como las siguientes. Debería encontrar un sistema confiable que ya lo haga y usarlo, en lugar de intentar construir uno por sí mismo.

  1. Primero, genera una clave simétrica. Esta es la Clave maestra y ningún usuario la verá directamente. No almacene esta clave (en texto sin formato) en ningún lugar donde un atacante pueda alcanzarla.
  2. Use la clave maestra para cifrar los datos, e idealmente también HMAC para la integridad (o use alguna otra forma de garantizar la integridad, como usar AES en el modo GCM).
  3. Ejecute la contraseña del usuario a través de una función de derivación de claves (como PBKDF2 o scrypt) usando diferentes parámetros (como un salt diferente) que se usa para el verificador de contraseña. No almacene estas Claves derivadas de contraseñas en ningún lugar.
  4. Cifre la clave maestra una vez con la clave derivada de la contraseña de cada usuario. Almacene estas copias cifradas de la clave maestra con los datos de la cuenta de cada usuario relevante.

Para acceder a los datos:

  1. Autentica al usuario. (Esto generalmente significa recuperar los parámetros del verificador de contraseña para su cuenta, ejecutar su contraseña a través de la función de obtención de claves que utiliza esos parámetros para generar un verificador de contraseña y luego verificar si ese verificador de contraseña coincide con el almacenado para ese usuario).
  2. Obtenga la clave derivada de la contraseña para el usuario. (Recupere el segundo conjunto de parámetros de KDF y pase la contraseña a su KDF utilizando esos parámetros; ya sabemos que la contraseña es correcta, por lo que puede esperar que la clave re-derivada sea correcta sin compararla con nada).
  3. Usando la clave derivada de la contraseña, descifre la clave maestra. Purgar la clave derivada de la contraseña de la memoria lo antes posible después de hacer esto.
  4. Con la clave maestra descifrada, verifique el HMAC de los datos (o, de lo contrario, garantice su integridad) y luego descifre los datos.
  5. Purgue la clave maestra descifrada de la memoria y luego acceda a los datos (en cuyo caso deberá repetir los pasos 2-4 si desea modificar los datos y guardar los cambios), o mantenga presionada la tecla maestra descifrada tan seguro de memoria como pueda organizar.
  6. Purgar la clave maestra descifrada y los datos descifrados de la memoria tan pronto como sea posible.

Para cambiar la contraseña de un usuario:

  • Si el usuario tiene su contraseña anterior (rotación de contraseña), verifique la contraseña anterior y luego úsela para generar la Clave derivada de la contraseña actual del usuario y con eso, descifre la Clave Maestra. Usando la nueva contraseña, genere la nueva clave derivada de la contraseña del usuario y vuelva a cifrar la clave maestra con ella. Reemplace la clave maestra cifrada anterior con la nueva (en la información de la cuenta del usuario).
  • Si el usuario ha olvidado su contraseña anterior, haga que un administrador verifique la identidad del usuario por otros medios, y haga que el usuario seleccione una nueva contraseña. Luego, pida al administrador que obtenga la clave maestra descifrada ingresando su propia contraseña, obteniendo su propia clave derivada de contraseña y usándola en su propia copia de la clave maestra cifrada. Usando la nueva contraseña del usuario, genere la nueva clave derivada de la contraseña del usuario y utilícela para cifrar la clave maestra. Coloque la Clave maestra cifrada con la nueva clave en la información de la cuenta del usuario, reemplazando la que fue cifrada utilizando la clave derivada de la contraseña antigua (olvidada).

Para gestionar usuarios:

  • Para los usuarios nuevos, básicamente, solo siga el flujo de "contraseña olvidada" arriba.
  • Para eliminar un usuario, o incluso simplemente revocar su acceso a los datos, elimine la copia de la Clave maestra cifrada utilizando la Clave derivada de la contraseña de ese usuario. Esto hace que sea imposible para el usuario usar su propia contraseña para obtener la Clave maestra por cualquier medio.

A pesar de los detalles (que solo están presentes para ayudarlo a comprender el sistema), POR FAVOR< no intente implementarlo usted mismo. Hay numerosos detalles críticos adicionales que faltan o se mencionan solo de pasada. Por ejemplo, es vital que el usuario nunca vea directamente la Clave maestra (de lo contrario, puede almacenar una copia de la misma, eliminando su capacidad de revocar efectivamente su acceso sin regenerar toda la estructura de la clave y volver a cifrar los datos). Muchos de estos detalles (como el almacenamiento seguro de claves en la memoria) dependerán de la plataforma.

Además, hay muchas formas de arruinar el cripto en sí mismo, incluso si se usan implementaciones de bibliotecas de los primitivos criptográficos; Si genera sus claves o parámetros de derivación de claves incorrectamente, y elige las primitivas incorrectas, o implementa cualquiera de los pasos de manera vulnerable a los ataques de canal lateral, todo su esquema podría verse comprometido. No trates de resolver esto por tu cuenta; Vaya con algo que alguien con conocimientos acerca de la implementación de criptografía ya haya reunido, y que alguien más con conocimientos haya revisado.

    
respondido por el CBHacking 07.09.2016 - 09:43
fuente
0

Dependerá en gran medida de los detalles de su aplicación, pero en términos más amplios ...

Podrías generar un par de claves público / privado para cada usuario. Cifre los datos con una clave simétrica, luego encripte esa clave simétrica con cada una de las claves públicas de los usuarios. Almacene esas copias cifradas individualmente de la clave simétrica única y devuélvalas a los usuarios respectivos cuando inicien sesión, y la copia única de los datos cifrados (simétricamente).

El usuario usa su clave privada para descifrar su copia de la clave simétrica, y luego la usa para descifrar los datos.

ADVERTENCIA: aquí estoy rechazando todo tipo de inquietudes que puedan hacer que este enfoque no sea viable para su aplicación. Consulte a un profesional de seguridad local antes de intentar "rodar su propio" protocolo criptográfico. Pero dicho esto, los amplios esquemas anteriores deberían hacer lo que está solicitando.

    
respondido por el JesseM 06.09.2016 - 23:54
fuente

Lea otras preguntas en las etiquetas