¿Es seguro almacenar una sola clave simétrica cifrada con varias claves públicas RSA diferentes?

8

Para el cifrado de campo de una base de datos que contiene información confidencial, estaba pensando en el siguiente diseño:

  • Cada usuario tiene una tarjeta inteligente utilizada para el inicio de sesión del certificado de cliente.
  • Después de iniciar sesión, el usuario obtiene la clave simétrica (AES, por ejemplo) cifrada con la clave pública de su tarjeta inteligente.
  • El usuario descifra la clave y la usa para cifrar / descifrar cualquier información sensible en el cliente.

En la base de datos hay una tabla que contiene todas las claves públicas de las tarjetas inteligentes del usuario y la clave simétrica global cifrada con la clave pública de cada usuario. El resto de los datos confidenciales se cifran con la clave simétrica.

¿Los datos están seguros si la base de datos se ve comprometida?

Otra posible solución sería almacenar adicionalmente la misma clave RSA global en todas las tarjetas inteligentes y usar esta clave con RSA-KEM para cifrar todos los datos sensibles. La desventaja sería que esto hace que sea más difícil cambiar la clave global en la configuración de producción, ya que todas las tarjetas inteligentes deberían ser reemplazadas / reprogramadas.

¿Qué piensas?

    
pregunta st_dx 27.02.2012 - 13:20
fuente

3 respuestas

6

Almacenar la misma clave simétrica cifrada de varias maneras no es un problema, pero usar la misma clave para cada cliente es, a menos que tenga un grado de confianza inusualmente alto entre los clientes, ya que permite a los clientes descifrar la comunicación de los demás servidor.

Sería más seguro generar una nueva clave simétrica para cada sesión, que luego se cifra mediante la clave asimétrica del cliente y se almacena durante la sesión.

    
respondido por el JGWeissman 27.02.2012 - 18:48
fuente
5

Un secreto compartido por más de dos personas ya no es un secreto.

Encriptar los datos con una clave simétrica K , y luego encriptar K con la clave asimétrica (RSA) de cada destinatario, significa dar acceso al destinatario a todos los datos encriptados con K ; "todos los datos" incluyen lo que estará encriptado con K . Este método de cifrado es la situación normal para los correos electrónicos seguros (por ejemplo, con OpenPGP ), pero un punto crucial es que un correo electrónico es " one shot "y cada correo electrónico está encriptado con su propia, específica, aleatoria K .

Con una base de datos , las cosas son más complicadas, porque una base de datos es un conjunto de datos que evoluciona con el tiempo. Al dar K a cada usuario, potencialmente les permite leer los contenidos de la base de datos no solo ahora, sino también los contenidos futuros que se agregarán más adelante. Esto no es necesariamente un problema: mientras un usuario determinado tenga acceso a una base de datos, puede (al menos en teoría) volcar todos los datos en un archivo propio, y no hay manera de hacer que "olvide" los datos. . Sin embargo, a la larga, esto requiere actualizaciones clave.

Por ejemplo, supongamos que, en algún momento, desea otorgar acceso a la base de datos a un nuevo usuario. Esto es simple: simplemente encripte K con la clave RSA de ese nuevo usuario. La operación dual de eliminar a un usuario es más compleja. Como no puede obligar a los usuarios a olvidar datos, lo mejor que puede lograr es negar el acceso a datos nuevos (datos que se agregan después de la eliminación del usuario), y esto implica elegir un nuevo K ' distinto de K (y K ' no debe ser computable desde K , por lo que estamos hablando de seleccionar un nuevo elemento aleatorio K ' desde cero). Así que hay dos opciones:

  1. Establezca el formato de su base de datos para que cada registro pueda etiquetarse con un identificador para la clave K que se usa para ese registro. Cada actualización clave implica crear un nuevo K con un nuevo identificador, y usar ese nuevo identificador en cada registro recién agregado o modificado. Se mantiene un repositorio para todo el K cifrado (indexado por identificador y por usuario). Tras el uso, cada usuario accede al repositorio utilizando la etiqueta en el registro de destino, para obtener la clave K que se utilizará para descifrar el registro.

  2. Cuando se actualiza la clave, todos los datos de la base de datos se descifran con el antiguo K y se vuelven a cifrar con el nuevo K . Se mantiene un repositorio para la versión encriptada de cada K (indexado por usuario).

El segundo método hace que el almacenamiento sea más sencillo, y tiene el agradable beneficio de "expulsar" a los usuarios eliminados (en el modelo de ataque, asumimos que un usuario eliminado se encargó de copiar todos los datos que pudo, pero si no lo hizo , luego expulsarlo explícitamente cis agradable). Sin embargo, las actualizaciones clave con el segundo método pueden ser bastante caras, dependiendo de su frecuencia y el tamaño de la base de datos. El primer método es más genérico y permite un control de acceso detallado (por ejemplo, hacer que los datos sean accesibles para algunos subconjuntos de usuarios).

Microsoft SQL Server tiene muchas funciones de soporte (como el nivel de lenguaje SQL) para implementar tales cosas (sin embargo, tenga en cuenta que la documentación de Microsoft sobre elementos criptográficos tiene una tendencia molesta a redefinir la terminología, a veces de forma abrupta en medio de la propia documentación).

    
respondido por el Thomas Pornin 15.09.2012 - 18:56
fuente
1

Entiendo que OpenPGP y muchos otros sistemas de cifrado hacen exactamente esto: almacenan una sola clave simétrica en muchos lugares, cada uno encriptado con una clave pública diferente. Cada persona usa su propia clave privada única para extraer la clave simétrica de una sola vez, y luego usa la clave simétrica para decodificar otras cosas.

" enlace "

" ¿Tamaño de archivo GPG con múltiples destinatarios? "

" enlace "

" enlace "

Sin embargo, esos sistemas asumen que está bien si todos quienes extraen esa clave simétrica pueden leer todo encriptado con esa clave.

Ese no parece ser el caso en tu situación, así que estoy de acuerdo con JGWeissman: genere una nueva clave simétrica nueva para cada sesión, que luego se cifra utilizando la clave pública de la tarjeta inteligente del usuario y se envía al usuario. Almacene esa nueva clave simétrica en ambos extremos solo durante la sesión.

No me queda claro si estos "datos confidenciales" son solo unos pocos archivos compartidos, cada uno de los cuales muchos, pero no todos, sus usuarios deberían poder leer; o si estos "datos confidenciales" son uno o más campos en su base de datos, cada uno de los cuales solo el usuario (y quizás una o dos personas más) debería poder leer.

Suponiendo que se trata de datos no compartidos por usuario que efectivamente son campos en su base de datos, Cada vez que se cambian esos campos lo haría

  • crea una nueva clave simétrica nueva
  • cifre la nueva versión de los datos de ese campo (s) con la nueva clave simétrica. (Idealmente, preferiríamos hacer este cifrado al final del usuario, de modo que el servidor de la base de datos nunca vea los datos en texto plano o la clave simétrica).
  • almacene los datos cifrados en la columna "datos cifrados" de la base de datos en la fila de ese usuario
  • cifre la nueva clave simétrica con la clave pública del usuario, y almacene esa clave cifrada en la base de datos en la fila de ese usuario
  • (opcional) cifre la nueva clave simétrica con la clave pública de la otra persona autorizada para leer esos datos y almacene esa clave cifrada en otra columna en la fila de ese usuario.
  • destruye cualquier copia de texto sin formato de la nueva clave simétrica
respondido por el David Cary 18.06.2012 - 23:43
fuente

Lea otras preguntas en las etiquetas