Fondo corto
Actualmente estoy diseñando una aplicación web en la que el usuario carga algunos archivos en el servidor y luego le pide al servidor que realice algunos cálculos basados en estos archivos (la tarea puede ponerse en cola si la carga de trabajo actual es alta). Luego, el servidor almacena el resultado y lo pone a disposición del usuario para que lo vea.
Estos archivos pueden contener datos privados y / o confidenciales y, por lo tanto, decidí buscar formas de mantener estos archivos seguros en el lado del servidor.
He investigado este tema pero no he encontrado la solución que estoy buscando. Tengo una idea general para el diseño, pero creo que tiene fallas y que podría estar reinventando la rueda (sin experiencia en este campo).
Comenzaré con los requisitos básicos, luego presentaré mi idea y terminaré con las preguntas que tengo.
Requisitos de seguridad
- El sistema debe cifrar los archivos antes de almacenarlos en el sistema de archivos
- Los administradores del sistema, etc., no deben poder descifrar los archivos en propio (el siguiente requisito tiene prioridad sobre este requisito)
- El sistema debe poder descifrar los archivos solo si el usuario proporciona autenticación
- El sistema debe admitir múltiples usuarios simultáneos con cada usuario capaz de autenticar solo el descifrado de los archivos cargados por ese usuario.
Idea actual
Almacenar los archivos de manera que el descifrado solo sea posible para el usuario parece bastante sencillo. Actualmente estoy pensando en el siguiente flujo de trabajo:
- El usuario crea un par de claves públicas / privadas (con algunas herramientas de terceros)
- El usuario carga la clave pública en el sistema
- El usuario carga el archivo (el archivo permanece en la memoria por ahora)
- El sistema genera una clave compartida para cifrar el archivo
- El sistema cifra el archivo con la clave compartida
- El sistema almacena el archivo
- El sistema cifra la clave compartida con la clave pública
- El sistema almacena la clave compartida encriptada
Creo que este enfoque es bastante común y no tiene inconvenientes serios.
Ahora la parte problemática. Ya que quiero que el usuario pueda permitir que el sistema descifre el archivo en algunas situaciones, este es el único flujo de trabajo que se me ocurrió:
- El usuario inicia una tarea que requiere un archivo cifrado
- El usuario carga la clave privada (solo permanece en la memoria)
- El sistema descifra la clave compartida (solo permanece en la memoria)
- El sistema elimina la clave privada de la memoria
- El sistema descifra el archivo en la memoria
- El sistema elimina de la memoria la clave compartida descifrada
- El sistema completa la tarea
- El sistema elimina el archivo descifrado de la memoria
- El sistema almacena el resultado de la tarea
Preguntas
Aunque creo que este enfoque sería funcional, todavía estoy preocupado por un par de cosas:
- ¿No estoy seguro de que cargar una clave privada como un archivo normal pueda considerarse una opción viable? - Si no me equivoco, al menos esto va en contra de las normas habituales.
- ¿Se puede transferir la clave privada de forma segura a través de Internet? - Me inclino a creer que puede, sin embargo, no he investigado cómo exactamente.
- Incluso si el archivo cifrado (o la clave privada) solo se guarda en la memoria por el tiempo mínimo necesario, ¿seguiría siendo un riesgo para la seguridad? - Siento que sigue siendo un riesgo, pero no grave.
- ¿Esto ya es un problema resuelto? - Si es así que no pude encontrar las soluciones
Como comentario final, me gustaría agregar que soy plenamente consciente de que cualquier sistema de este tipo requeriría la confianza de los usuarios. Principalmente, me gustaría saber si esto se puede lograr de alguna manera, ¿es viable mi idea y existe una forma mejor / alternativa?