¿Es un problema de seguridad almacenar los mismos datos varias veces con diferentes claves de cifrado?

5

Estoy buscando crear un sistema donde muchos de los datos estén encriptados dentro de la base de datos. El método de encriptación será un algoritmo fuerte actualmente aceptado.

Para acceder a estos datos, un usuario deberá iniciar sesión y luego los datos deberán ser descifrados con alguna clave. Habrá muchos usuarios que deberían tener acceso a los mismos datos.

No quiero almacenar esta clave 'maestra' en el código fuente (PHP), en el disco o en cualquier otro lugar en texto sin formato.

Entonces, pensé que podía cifrar la clave de descifrado "maestra" con la propia contraseña de cada usuario y almacenarla junto con su registro de usuario. Al iniciar sesión, obtienen la clave maestra descifrada, que luego está disponible en la memoria para que descifren los datos de la aplicación.

Mi preocupación inicial es que si hay una violación de datos del código fuente y de los datos, entonces un atacante vería que la misma clave se cifró muchas veces (una vez para cada usuario). ¿Podría esto reducir la seguridad de la clave 'maestra'? ¿Ya sea por patrones en los datos encriptados o probando que un intento de descifrado en un registro coincide con el de otro?

O, ¿simplemente estoy ladrando el árbol equivocado y ya existe un método mejor?

    
pregunta Chris Rutledge 05.01.2018 - 10:25
fuente

2 respuestas

4

Está describiendo algunos problemas diferentes.

Almacenamiento de credenciales y otros secretos

  

No quiero almacenar esta clave 'maestra' en el código fuente (PHP), en el disco o en cualquier otro lugar en texto sin formato.

Usted tiene razón al decir que los secretos de codificación son una mala idea, puede intentar usar algo como hashicorpo-vault ( Este artículo en particular puede también debe estar relacionado con su flujo de trabajo) o con un servicio de administración de claves como Amazon KMS .

Acceso cifrado multiusuario

Hay algunas estrategias diferentes para este tipo de configuración. Puede cifrar los datos con una clave compartida y luego cifrar esa clave para cada usuario utilizando la clave pública del usuario. A continuación, deberá actualizar la clave por archivo y volver a cifrar con la clave pública de cada usuario si hubiera algún cambio en la membresía del grupo de acceso.

La obtención de una clave basada en la contraseña puede ser complicada porque debe asegurarse de actualizar correctamente todas las claves y rehacer todo el cifrado si la contraseña del usuario cambia.

Es posible que desee ver proyecto Mylar de MIT , ya que trata de lograr algo similar al almacenamiento y acceso. modelo que describiste.

Escenario de infracción

  

Mi preocupación inicial es que si hay una violación de datos del código fuente y de los datos, entonces un atacante vería que la misma clave se cifró muchas veces (una vez para cada usuario). ¿Podría esto reducir la seguridad de la clave 'maestra'?

Si alguna vez descifras el lado del servidor y el atacante tiene acceso, pueden obtener la copia desencriptada de los datos.

Si está creando el usuario claves privadas usando la contraseña como semilla entonces tiene algunos riesgos, especialmente si las contraseñas se pueden identificar robándolas o invirtiendo los hashes.

Más en general

  

¿Esto podría reducir la seguridad de la clave 'maestra'? ¿Ya sea por patrones en los datos encriptados o probando que un intento de descifrado en un registro coincide con el de otro?

Creo que está preguntando si cifrar el mismo valor con múltiples claves diferentes para cada usuario haría que sea más fácil volver al valor de texto sin formato original (?).

Si conoce el valor de texto sin formato, es posible que pueda averiguar los otros valores de cifrado. Esto se conoce como un ataque " texto plano conocido ". Sin embargo, esto no significa que funcione si simplemente conoce dos resultados de cifrado diferentes y sabe que la entrada fue la misma, pero no conoce la entrada real.

Su pregunta también puede ser que, dada la función de cifrado f(key, masterkey) y luego ejecutarlo una vez con key1 y luego con key2 , comparar los dos resultados le permitirá calcular masterkey o conocer el resultado de% ¿Co_de% te permite calcular f(key1, masterkey) ?

Puede ser posible, pero dependería de los algoritmos específicos, si hay relleno, etc. Si hay una entropía significativa en los algoritmos, entonces los cambios leves en las entradas deberían dar salidas muy diferentes que no muestren patrones. También puede leer " teclas débiles " y ataques de texto simple elegido .

    
respondido por el Eric G 05.01.2018 - 18:28
fuente
2

Lo importante a considerar en una hipotética como esta es dónde están tus puntos débiles y lo que significará una violación de eso.

Entonces, en este caso, tenemos una clave de descifrado maestra muy fuerte.

Obviamente, estamos almacenando este cifrado con algo Suficientemente Fuerte (TM).

Ahora llegamos a la debilidad criptográfica más antigua del mundo de las contraseñas de los usuarios. Digamos que tienes 1000000000 usuarios. Todos ellos son doctores en seguridad / ciencia ficción que han escrito disertaciones sobre la buena gestión de contraseñas. Uno es Jim. Ahora, Jim es el hijo del dueño. Cuando se trata de expertos en seguridad, tiene aproximadamente 3 vatios. Su contraseña es passworddrowssap, y él cree que es muy inteligente para pensar en eso.

Algún día su base de datos se violada. Exfiltrado fuera del sitio, nada menos. Lanzan todos los datos de User_tbl en hashcat y se van por unas horas. Vuelven a una contraseña violada: la de Jim. Ahora pueden descifrar la clave maestra usando la contraseña de Jim. Ahora tienen acceso completo a todos los datos confidenciales y encriptados en la base de datos. Gracias, Jim.

Su solución no es terrible, y no puedo pensar en una buena solución real, pero compensa toda la seguridad de la base de datos hasta la contraseña más débil que usan los usuarios.

    
respondido por el Adonalsium 05.01.2018 - 16:41
fuente

Lea otras preguntas en las etiquetas