Estoy creando un sistema para compartir archivos, en el que la clave única de un archivo es uno de los componentes críticos para la recuperación de ese archivo. Para simplificar, digamos que las claves únicas son los nombres de los archivos. Me gustaría mantener estos nombres de archivo en secreto y ponerlos a disposición solo para el propietario de los archivos y para otros usuarios con acceso a ellos.
Así es como diseñé mi solución:
El usuario U1 tiene una clave de enmascaramiento CMK1 almacenada en un KMS. También tiene archivos con nombres F1, F2 y F3. Me gustaría mantener estos nombres de archivo en secreto. Para ocultar sus nombres, el usuario U1 crea las claves K1, K2 y K3, las cifra con CMK1 y las guarda en una base de datos como CMK1 (K1), CMK1 (K2) y CMK1 (K3). Los nombres de los archivos se guardan en una base de datos separada como K1 (F1), K2 (F2), K3 (F3).
En este punto, todos los K1, K2, K3 y F1, F2, F3 nunca se guardan como texto sin formato, y CMK1 está a salvo dentro del KMS.
Cuando el usuario U1 quiere compartir el nombre de archivo F1 con el usuario U2, le da K1. El usuario U2 lo guarda como CMK2 (K1), y ahora tiene acceso a K1 (F1) en la base de datos. No tiene acceso a K2 (F2) y K3 (F3).
Ahora, las claves y los nombres de archivo aún están cifrados y U2 sabe el nombre de F1.
Sin embargo, esto crea un problema de escala: en el mejor de los casos (nadie comparte nada) tendré que mantener tantas como #Users + #Files
claves y tantas como #Files
entradas de la base de datos. En el peor de los casos (todos los usuarios comparten todos sus archivos con todos), tendré que mantener la misma cantidad de claves y muchas entradas de la base de datos #Users * #Files
.
¿Hay una manera más eficiente de diseñar esto?
¿Hay un mejor enfoque para esto en conjunto?