Sto creando un sistema di condivisione file, in cui la chiave univoca di un file è uno dei componenti fondamentali per il recupero di quel file. Per semplicità, diciamo che le uniche chiavi sono i nomi dei file. Mi piacerebbe mantenere segreti questi nomi di file e renderli disponibili solo al proprietario dei file e ad altri utenti con accesso ad essi.
Ecco come ho progettato la mia soluzione:
User U1 has a masker key CMK1 stored in a KMS. He also has files with names F1, F2 and F3. I'd like to keep these filenames a secret. To hide their names, user U1 creates keys K1, K2 and K3, encrypts them with CMK1 and saves them in a database as CMK1(K1), CMK1(K2) and CMK1(K3). The file names are saved in a separate database as K1(F1), K2(F2), K3(F3).
At this point all of K1, K2, K3 and F1, F2, F3 are never saved as plaintext, and CMK1 is safe inside the KMS.
When user U1 wants to share file name F1 with user U2, he gives him K1. User U2 saves it as CMK2(K1), and now has access to K1(F1) in the database. He does not have access to K2(F2) and K3(F3).
Ora, le chiavi e i nomi dei file sono ancora crittografati e U2 conosce il nome di F1.
Tuttavia, questo crea un problema di scala: nel migliore dei casi (nessuno condivide nulla) dovrò tenere un massimo di #Users + #Files
chiavi e fino a #Files
voci del database. Nel peggiore dei casi (tutti gli utenti condividono tutti i loro file con tutti), dovrò mantenere la stessa quantità di chiavi e quanto #Users * #Files
di voci del database.
C'è un modo più efficiente per progettare questo?
C'è un approccio migliore a questo?