Opiniones sobre mi idea de implementación de "Cifrado en reposo"

1

Ok, visión general básica del entorno que estoy imaginando: Webapp w / db backend que almacena datos confidenciales, posiblemente phi; usuario estándar: pasa la autenticación debido a usuarios imposibles de aprender.

Mi idea fue cifrar los datos de las filas en tablas confidenciales almacenadas en una base de datos utilizando una clave derivada de la contraseña del usuario (es decir, el hash pw utilizando un algoritmo diferente al de cómo se almacena la pw en db: por ejemplo, store for auth : pez globo (pw), cifrar w / clave = md5 (pw)). De esa manera, podría almacenar la clave de cifrado en la sesión (para permitir que los usuarios autenticados accedan a sus registros sin volver a ingresar a pw) sin aumentar el riesgo de fugas de pw y podría destruir w / sesión y regenerarse al iniciar sesión.

Beneficios:

  • Me parece que un atacante no podría usar los datos si los robó mientras estaba "en reposo", es decir, la aplicación se apagó o se realizó una copia de seguridad.

Inconvenientes que ya puedo ver:

  • Si olvida su contraseña, perderá todos sus datos.
  • Se vuelve imposible editar los contenidos de la base de datos manualmente, todo debe ser autenticado con el pw utilizado para generar la clave de cifrado.
  • No protege los datos mientras existe una sesión.

Lo que realmente me gustaría saber:

  • ¿Me estoy perdiendo algún defecto fatal en mi esquema?
  • ¿Existe una mejor manera de almacenar la clave de cifrado mientras la sesión está activa?

Aclaración:

Ok, creo que no estaba claro en mi redacción original de la pregunta. Quise decir que almacenaría un hash criptográficamente seguro de la contraseña (probablemente usando blowfish) para la autenticación, lo que significa que una colisión o fuerza bruta de la contraseña no será fácil (a menos que alguien rompa el blowfish, lo que siempre es un riesgo). Simultáneamente a la autenticación (cuando alguien ingresa su contraseña de todos modos), pateo la contraseña usando algún otro algoritmo (probablemente algo como md5, ya que no creo que deba ser criptográficamente seguro en este punto) que luego se almacenaría en la sesión y se utiliza para cifrar / descifrar las filas que pertenecen al usuario autenticado durante la sesión.

Mis pensamientos en relación con una mayor superficie de ataque son, por lo tanto:

  • Si un atacante compromete el hash de la contraseña utilizada para la autenticación, simplemente puede iniciar sesión en la aplicación normalmente y extraer los datos de esa manera.
  • Si un atacante compromete el cifrado de los datos de la base de datos, tiene todo en ese punto y no tiene sentido obtener la contraseña. Sin embargo, si pudieran extraer la clave de cifrado y, por algún motivo, querían iniciar sesión en la aplicación, no se beneficiarían de los ataques de colisión en md5 porque ese no es el hash utilizado para almacenar / autenticar la contraseña. Y una colisión contra un hash está básicamente garantizada para no ser una colisión contra otro algoritmo de hashing diferente.

Posible remediación de debajo vulnera:

  • genere una buena clave criptográfica pseudoaleatoria antes de que se almacene cualquier información
  • cifrar la clave criptográfica con la contraseña (no necesito transformar la contraseña para esta versión, no lo creo)
  • en clave de descifrado de inicio de sesión y clave de almacenamiento en sesión
  • use la clave para realizar el cifrado / descifrado en el resto de los datos

por qué creo que esto podría funcionar es que no se puede diferenciar el texto en claro del descuido descifrado incorrectamente, por lo que se pierde la capacidad de verificar si su suposición fue correcta, incluso si tiene una lista de posibilidades probables que no puede decir si alguna funcionó . Además, no obtiene ayuda bruta forzando la clave de cifrado porque ahora es un valor aleatorio adecuado.

    
pregunta Camden Narzt 10.09.2014 - 08:10
fuente

2 respuestas

-1

La falla más grande que veo, es que estás usando la contraseña de dos maneras diferentes y, por lo tanto, duplicando la superficie de ataque. En su esquema, una debilidad descubierta en el método de cifrado o el algoritmo de hashing permitiría un acceso completo a los datos del usuario.

Hay tres pasos que propones:

  

Primero: tomamos la contraseña y la procesamos usando un buen algoritmo conocido. Esto es seguro.
  Segundo: Tomamos la contraseña nuevamente y la procesamos usando MD5
  Tercero: tomamos el hash MD5 y lo usamos como clave de cifrado en algunos datos confidenciales

Como puede ver, el hash MD5 de la contraseña está contenido dentro del cifrado de los datos. No se guarda directamente, pero está implícito en el propio cifrado. Al igual que una cerradura de puerta contiene una impresión negativa de la llave requerida para abrirla.

Ahora, la única manera de que el cifrado sea seguro es que la clave sea demasiado grande para la fuerza bruta. Sin embargo, su clave es el hash MD5 de la contraseña (desconocida). Ahora, asumamos que no me importa la contraseña, solo quiero acceder a los datos. No tengo que adivinar la contraseña, o encontrar alguna debilidad con el cifrado, ya que estás usando MD5 sin un salt. Puedo descargar una tabla arco iris de hashes MD5 y usarlos como clave de descifrado en los datos. Tan pronto como los datos se descifran correctamente, sé cuál fue el hash MD5 de la contraseña. Si estoy interesado en la contraseña, ¡ya la obtuve al encontrar el hash MD5! Además, cualquier usuario con la misma contraseña recibiría el mismo hash MD5 y, por lo tanto, la misma clave de cifrado. ¡Ahora puedo descifrar varios datos confidenciales de usuarios a la vez!

Me parece que el cifrado completo del disco protegería mejor su base de datos para copias de seguridad, ya que la copia de seguridad solo contendría información cifrada. Sin embargo, esto no evitaría un ataque activo, mientras la aplicación se está ejecutando.

    
respondido por el Chris Murray 10.09.2014 - 12:24
fuente
0

El único problema de seguridad real que veo con su enfoque es que solo parece hablar sobre el cifrado de los datos; no verifica que los datos cifrados no hayan sido manipulados. Sería posible modificar los datos cifrados (donde acaba de tomar un mensaje, aplicar el modo AES-CBC o AES-CTR a los datos), donde puede adivinar la forma del texto sin formato y modificar el valor (mediante XORing según corresponda al bloque). modo de cifrado para cambiar el XOR correspondiente de los datos de texto sin formato). La forma de protegerse contra esto es utilizar modos de cifrado autenticados que combinen el cifrado con un código de autenticación de mensaje (más o menos un hash que solo puede crear si conoce la clave secreta).

Veo muchos problemas de usabilidad desde su enfoque. Primero, pierde la mayor parte del beneficio de usar una gran base de datos para almacenar información sobre muchos usuarios. No puede agregar, actualizar o modificar la información cifrada para un usuario si ese usuario no ha iniciado sesión (por ejemplo, ya que no puede usar esto para un sistema de mensajería o para un sistema que importa información automáticamente de una fuente externa). No puede crear índices, búsquedas rápidas, agregaciones o uniones dentro de su RDBMS que actúan sobre los datos en una fila cifrada. El planificador de consultas de su base de datos no puede planificar la distribución de sus datos cifrados para ejecutar el plan correcto. Los datos no se pueden compartir entre los usuarios que deberían poder acceder a la misma información sin guardar copias redundantes, lo que va en contra de las reglas básicas del diseño de la base de datos y lo dejará con datos inconsistentes (ya que solo puede actualizar la información para el usuario actual ).

Como mencionaste, no hay manera de tratar con un usuario que olvida su contraseña sin borrar todos sus datos. Necesitará modificar esto para que esta característica esté presente, ya que los usuarios reales necesitarán restablecer sus contraseñas. (Puede hacer algún tipo de sistema en el que almacene cada clave de usuario de forma cifrada con una clave segura protegida con frase de contraseña).

Finalmente, esto no te ofrece mucha seguridad adicional. Cualquiera que obtenga acceso de administrador en esos sistemas podría obtener acceso a los datos protegidos si fueran un poco pacientes y solo esperaran a que el usuario inicie sesión. Simplemente registran las solicitudes de red entrantes y capturan las contraseñas del usuario (en cuyo momento pueden descifrar los datos, ya sea a través del sistema o desde un volcado de base de datos). No parece significativamente más seguro que tener una aplicación bien desarrollada en un disco duro cifrado (con copias de seguridad cifradas), donde se realizan estrictos controles de usuario y registro en todos los pasos.

    
respondido por el dr jimbob 10.09.2014 - 23:32
fuente

Lea otras preguntas en las etiquetas