Ho pensato un po 'alle risposte che sono state pubblicate finora, e c'è una promessa interessante nell'idea di utilizzare un algoritmo a chiave pubblica. Pensando ad alta voce, ogni utente potrebbe avere una coppia di chiavi pubblica / privata (in cui ogni chiave pubblica è memorizzata sul server centrale insieme ai database).
Archiviazione chiave pubblica sul server:
+-------+------------------------+
| Alice | [public key for Alice] |
+-------+------------------------+
| Bob | [public key for Bob] |
+-------+------------------------+
| Carl | [public key for Carl] |
+-------+------------------------+
Ogni voce verrà archiviata crittografata, utilizzando un cifrario simmetrico con una chiave per voce generata casualmente dal server ogni volta che viene scritta una voce:
+---+-------------------------------------------------+
| 0 | symmetric_cipher([plaintext 0], [random key 0]) |
+---+-------------------------------------------------+
| 1 | symmetric_cipher([plaintext 1], [random key 1]) |
+---+-------------------------------------------------+
| ... |
+---+-------------------------------------------------+
| 9 | symmetric_cipher([plaintext 9], [random key 9]) |
+---+-------------------------------------------------+
Per il controllo degli accessi, una terza mappatura potrebbe memorizzare la chiave generata a caso per ogni voce, che è stata crittografata utilizzando la chiave pubblica di ciascun utente autorizzato:
+-------+---+-------------------------------------------------------+
| Alice | 0 | pubkey_cipher([random key 0], [public key for Alice]) |
+-------+---+-------------------------------------------------------+
| Bob | 0 | pubkey_cipher([random key 0], [public key for Bob]) |
+-------+---+-------------------------------------------------------+
| Alice | 1 | pubkey_cipher([random key 1], [public key for Alice]) |
+-------+---+-------------------------------------------------------+
| Bob | 1 | pubkey_cipher([random key 1], [public key for Bob]) |
+-------+---+-------------------------------------------------------+
| ... |
+-------+---+-------------------------------------------------------+
| Alice | 8 | pubkey_cipher([random key 8], [public key for Alice]) |
+-------+---+-------------------------------------------------------+
| Carl | 8 | pubkey_cipher([random key 8], [public key for Carl]) |
+-------+---+-------------------------------------------------------+
| Alice | 9 | pubkey_cipher([random key 9], [public key for Alice]) |
+-------+---+-------------------------------------------------------+
| Carl | 9 | pubkey_cipher([random key 9], [public key for Carl]) |
+-------+---+-------------------------------------------------------+
(Da quello che ho letto, questo è un po 'quello che fa GPG quando si invia un messaggio crittografato a più destinatari.)
Ogni utente può utilizzare la propria chiave privata per decifrare la chiave simmetrica "entrata", valida solo per quella specifica voce. Quella chiave permetterà loro di decifrare e leggere quella voce. Se hanno bisogno di cambiarlo e di ri-salvarlo, potrebbero usare la stessa chiave con cui hanno letto e sovrascriverlo, oppure il server potrebbe generare una nuova chiave di accesso e utilizzare la chiave pubblica per ogni utente autorizzato per aggiornare l'altro interessato righe.
Ristabilire un utente sarebbe semplice come rimuovere la loro riga dalla tabella di mappatura user-to-entry. Se ci si preoccupa che possano aver memorizzato una o più chiavi di accesso, queste possono essere rigenerate in modo trasparente per ciascun utente rimanente senza alcun intervento da parte loro.
Sembra che la preoccupazione principale sarebbe spostarsi per garantire che i canali di comunicazione client-server fossero sicuri e che il client possa mantenere segreti i suoi segreti.