Estoy trabajando en una aplicación en la que el objetivo es cargar los datos del usuario, almacenarlos, hacer un procesamiento de esos datos y presentarlos al usuario cuando se le solicite. Queremos seguir el modelo de encriptación de extremo a extremo en el que el sistema no tiene forma de descifrar los datos que un usuario subió. No he tratado la seguridad de esta manera antes y en la arquitectura presentada tengo algunas preguntas / inquietudes que quiero compartir con todos ustedes.
Métodos:
-
Cuando un usuario se registra, generamos una clave privada pública para él, la clave privada se denomina clave maestra aquí.
-
Cuando un usuario agrega información, la ciframos usando la clave de sesión. Solo la unidad de procesamiento de datos (DPU) de nuestro sistema debe poder descifrar estos datos. Dado que el tamaño de los datos puede ser mayor que RSA-3072, los datos se encriptan primero con AES-256 y luego se encriptan con la clave de sesión RSA.
-
Los datos cargados van a DPU, los descifran, procesan y encriptan nuevamente.
-
Cuando el usuario desea acceder a esta información, ciframos la clave maestra con la clave de sesión y la enviamos a DPU para descifrar esos datos.
-
La DPU posterior al descifrado recopila todos los datos solicitados, genera una nueva clave de datos, cifra la respuesta usando esta clave de datos, cifra la clave de datos con la clave pública de la sesión del cliente y ensambla tanto la clave como la respuesta cifradas y la devuelve.
-
La aplicación del cliente descifra la clave con la clave privada de la sesión del cliente y la respuesta se descifra con la clave de datos.
Preocupaciones:
-
Este modelo es teórico a partir de ahora, ¿es esto posible?
-
¿Quién genera estas claves (claves de sesión, claves de datos), los desarrolladores (Java y Python) generan estas claves y dónde las almacenamos?
-
¿Hay alguna biblioteca que podamos usar para hacernos la vida más fácil? Nuevamente, no queremos que nuestro sistema pueda acceder a los datos del usuario sin la clave maestra del usuario que se encuentra en su dispositivo. Planeamos utilizar AWS Cognito para la autenticación y la autorización y, por lo que sé, no proporciona ninguna clave de sesión. ¿Cómo podemos lograr lo que se menciona?
-
Enviar una clave privada por cable para descifrar los datos, ¿es una buena idea?
Sé que es mucha información, por favor, avíseme si tiene más preguntas, esperando sugerencias / comentarios.