Sto scrivendo un'applicazione Java open source per Google App Engine (GAE). L'applicazione consentirà agli utenti di creare contenuti destinati a essere privati. Voglio fornire ragionevoli garanzie che nessuno (incluso me, come amministratore del sito) sarà in grado di leggere contenuti privati che appartengono a qualcun altro. Qual è il modo migliore per farlo?
Il sito verrà pubblicato utilizzando https. Gli utenti accederanno alla mia applicazione usando OpenId, quindi non ho il controllo delle loro credenziali di accesso (non ho la loro password).
Sulla base delle ricerche che ho svolto fino ad ora, penso che una soluzione potrebbe essere quella di crittografare i dati scritti sul datastore GAE usando una chiave di crittografia basata su password. L'utente sceglierebbe una password separata da utilizzare solo per crittografare i propri dati privati. Per generare la chiave di crittografia, avrei hash la password in qualche modo (forse bcrypt?). I dati scritti sul datastore GAE verranno quindi crittografati utilizzando la chiave di crittografia più un salt, e il sale verrà memorizzato insieme al blob crittografato. Non memorizzarei mai la password o la chiave di crittografia in modo permanente, ma probabilmente dovrei conservare la chiave di crittografia nella sessione mentre l'utente ha effettuato l'accesso.
Questa è una buona soluzione? Ci sono altre soluzioni che dovrei considerare invece?
Gradirei anche qualsiasi suggerimento su applicazioni open source esistenti che facciano questo genere di cose correttamente.
Modifica (20 dic 2011):
Cercherò di chiarire che cosa sto cercando.
Google App Engine supporta due ruoli: utenti e amministratori. In questo caso, un utente è chiunque scelga di accedere al sito tramite OpenId. Un amministratore è un tipo speciale di utente che ottiene anche l'accesso alla console di amministrazione dell'applicazione. Tra le altre cose, gli amministratori possono visualizzare i registri e manipolare direttamente il datastore di back-end (lettura e scrittura). Alcuni amministratori, chiamiamoli amministratore / sviluppatori, hanno anche la possibilità di distribuire un nuovo codice.
Ci si può aspettare che gli utenti creino contenuti sia pubblici che privati. Voglio che gli utenti si sentano sicuri che i contenuti che contrassegnano come "privati" non possono essere visualizzati da nessun altro.
Riconosco che un amministratore / sviluppatore malintenzionato potrebbe caricare il codice con una backdoor per eludere il design della privacy. Tuttavia, quel problema dovrà essere risolto tramite auditing. Poiché il codice è open source, gli utenti preoccupati per l'implementazione del software hanno l'opportunità di rivedere il codice e convincersi della sua integrità.
Riconosco anche che gran parte di questo è semplicemente una buona progettazione dell'applicazione. Ad esempio, il back-end dovrebbe richiedere l'autenticazione e non consentire agli utenti autenticati di visualizzare i dati che non possiedono. Ci dovrebbe essere anche una copertura di prova sufficiente a confermare che questa funzionalità funzioni come previsto. Questa parte del design dell'applicazione è già in atto.
Quando ho posto questa domanda, speravo di trovare una soluzione che offrisse un livello più alto di sicurezza. Sto cercando un design che protegga, per quanto pratico, da utenti malintenzionati, amministratori malintenzionati e bug software non intenzionali nei sistemi che controllo. Se allo stesso tempo questa soluzione offre anche una certa protezione contro i fornitori di sistemi dannosi o incompetenti (ad esempio, il personale di Google guarda cose che non dovrebbero, o bug di App Engine che rivelano inavvertitamente i miei dati), allora è ancora meglio.
Mi rendo conto che non posso proteggere contro ogni vettore di attacco in un'applicazione come questa, e certe soluzioni saranno troppo brutte - o troppo fastidiose dal punto di vista dell'utente - per essere pratiche. Non ci può essere una soluzione che sia "migliore" di quella che ho già implementato. In tal caso, vorrei documentare il ragionamento alla base di tale conclusione. Tuttavia, se esiste una soluzione ragionevole, mi piacerebbe trovarla.