Cifrado anidado para múltiples usuarios

1

He desarrollado una aplicación web (desarrollada en .NET MVC 4) que tiene múltiples usuarios con credenciales de inicio de sesión personales. La aplicación web contiene una gran cantidad de contenido cargado por los usuarios.

Mi cliente también desea tener una versión sin conexión de la aplicación, para Windows. Esta aplicación debe utilizar la misma información disponible en la web, debe estar disponible fuera de línea y debe estar protegida de manera que el usuario no pueda tomar el contenido de la aplicación y dárselo / venderlo a un competidor (en una manera fácil).

Por lo tanto, en mi aplicación web he implementado una funcionalidad para crear un paquete de aplicaciones que contiene toda la información relevante, que se puede descargar y cifrar con una clave simétrica. Sin embargo, cada usuario debe poder descifrar el paquete con sus credenciales (es decir, contraseñas personales).

Entonces, cuando se crea un usuario, creo un par de claves asimétricas para ese usuario, y la clave privada se almacena en la base de datos como una cadena encriptada donde la clave es la contraseña privada (almacenada como un hash de bcrypt).

Esta lista de eventos significa que hay una gran cantidad de cifrado anidado y me hace sentir incómodo porque no sé si es lo suficientemente seguro, por lo que me gustaría recibir algunos comentarios sobre mi método de elección.

La cadena de funcionalidad;

Al crear un usuario;

  1. Crear un par de claves asimétricas
  2. Cifre la clave privada con la contraseña de la credencial del usuario
  3. hash la contraseña con bcrypt
  4. Almacene hash + clave privada cifrada para el usuario

Al crear un paquete de aplicación;

  1. Crear una clave simétrica [lado del servidor]
  2. Cree un paquete de aplicación (datos sin procesar) y cifrelo con el clave simétrica [lado del servidor]
  3. Para cada usuario, cifre la clave simétrica con la clave pública de los usuarios y almacene el resultado para que se pueda descargar [lado del servidor]
  4. Un usuario inicia sesión para descargar el paquete + cifrado simétrico clave + clave privada encriptada [lado del servidor]
  5. Descifre la clave privada, encriptada y almacenada con la credencial del usuario contraseña [lado del cliente]
  6. Descifre la clave almacenada, cifrada y simétrica con el ahora descifrado clave privada para el usuario [lado del cliente]
  7. Descifre el paquete de la aplicación (en la memoria de la computadora del cliente) y muestre el contenido a través de un pequeño servidor integrado [lado del cliente]

¿Es esta una forma bastante segura de resolver mi problema? ¿Puedo hacerlo de otra manera? ¿Hay agujeros de seguridad obvios en esta solución?

    
pregunta Björn 15.01.2014 - 17:38
fuente

2 respuestas

1

Si desea hacerlo para que los datos permanezcan cifrados, excepto para algunos usuarios, cada uno con una contraseña, entonces tiene la secuencia correcta. Sin embargo, le ayudará mucho no a volverlo a implementar desde cero. Con un punto de vista ligeramente más alto:

  • Cada usuario tiene un llavero que contiene su clave privada y está protegido por una contraseña.
  • Los datos de la aplicación están cifrados asimétricamente con la clave pública del usuario.
  • El cifrado asimétrico se realiza para que sea eficiente: es adecuado para docenas de megabytes de datos, y cuando se cifran los mismos datos para los usuarios de varios , la mayor parte de los datos solo se almacenan. una vez.

En ese punto, reconoces que el problema es lo que GnuPG resuelve. GnuPG implementa el formato OpenPGP que fue diseñado inicialmente para correos electrónicos , pero de hecho puede procesar bloques de datos arbitrarios. Las bibliotecas y las herramientas ya incluyen todo el cifrado híbrido y el uso compartido para múltiples destinatarios, y también la protección mediante contraseña de la clave privada. El formato es un estándar razonablemente bien estudiado, existen varias implementaciones de código abierto en varios idiomas, esto se mantiene y es general . Y no tiene que dedicar tiempo de reflexión a las claves simétricas subyacentes y los algoritmos anidados.

Sin embargo, el objetivo podría ser inalcanzable. Si los datos están disponibles, en algún momento, en la computadora del atacante (aquí, el propio atacante es el usuario que desea extraer los datos y venderlos a los competidores), entonces el atacante podrá poder Para obtenerlo directamente. Esa es su computadora; él puede escanear la memoria RAM a voluntad.

Por supuesto, podemos comenzar a discutir sobre qué tan "fácil" es para el usuario "promedio". Pero debe recordarse que si hubiera una forma segura de proteger los datos en estas condiciones, no habría piratería de música, películas o videojuegos; y aunque el valor individual de una sola canción es bajo, la gente do extrae datos de los jugadores.

En gran medida, el valor agregado de un esquema de cifrado basado en GnuPG, en su situación, es que hace que sea muy obvio e innegable que su intención es prevenir y prohibir la extracción masiva de datos. Esto puede ayudar en situaciones legales; quien haya extraído los datos ya no puede afirmar que no sabía que estaba prohibido.

    
respondido por el Thomas Pornin 21.01.2014 - 19:13
fuente
2
  

debería estar disponible sin conexión y debería estar protegido de forma que el usuario no pueda tomar el contenido de la aplicación y entregarlo / venderlo a un competidor

Esto no es en general posible. El usuario controla su computadora y puede pasar por alto cualquier mecanismo de seguridad si está motivado para hacerlo. Por ejemplo, podría usar un depurador para detener el programa y leer las claves de la memoria.

La prevención completa por medios técnicos no es posible, por lo que es el objetivo equivocado. Los objetivos adecuados son:

  • Mantenga a la gente honesta honesta
  • Proporcionar evidencia de falsificación / pista de auditoría.

Lo primero se puede lograr de manera relativamente fácil mediante la ofuscación o el cifrado de archivos locales de alguna manera. Sin embargo, su esquema es exagerado. Solo necesita emitir a cada usuario una clave única (que almacena la aplicación) y emitir los documentos / recursos cifrados a esa clave. Por supuesto, pueden descifrarlo fácilmente si se esfuerzan un poco.

El segundo debe lograrse utilizando algún tipo de esquema de marca de agua. Hay muchas, pero si, por ejemplo, está suministrando el contenido como archivos PDF, puede marcarlos con marca de agua fácilmente, por ejemplo, "Esta copia se envió a [email protected] el 2014-01-21" en cada página: esto estará visible al usuario. (En gris claro, recorrer el borde izquierdo de la página es una opción popular). También es posible que desee incluir una segunda marca de agua "secreta", para intentar atrapar a quienes hacen todo lo posible para borrar la evidente.

La marca de agua requiere que emita una copia individual para cada usuario. Esto no es técnicamente difícil, por supuesto, pero puede ser inconveniente.

    
respondido por el Ben 21.01.2014 - 18:50
fuente

Lea otras preguntas en las etiquetas