Estoy escribiendo una aplicación Java de código abierto para Google App Engine (GAE). La aplicación permitirá a los usuarios crear contenido que pretende ser privado. Quiero ofrecer garantías razonables de que nadie (incluyéndome a mí, como administrador del sitio) podrá leer contenido privado que pertenezca a otra persona. ¿Cuál es la mejor manera de lograr esto?
El sitio se servirá utilizando https. Los usuarios iniciarán sesión en mi aplicación utilizando OpenId, por lo que no tengo el control de sus credenciales de inicio de sesión (no tengo su contraseña).
Basándome en la investigación que he realizado hasta ahora, creo que una solución podría ser cifrar los datos escritos en el almacén de datos de GAE utilizando una clave de cifrado basada en contraseña. El usuario elegiría una contraseña por separado que se usará solo para cifrar sus datos privados. Para generar la clave de encriptación, debería codificar la contraseña de alguna manera (¿quizás bcrypt?). Los datos escritos en el almacén de datos de GAE luego se cifrarían utilizando la clave de cifrado más un salt, y la sal se almacenaría junto con el blob cifrado. Nunca almacenaría permanentemente la contraseña o la clave de cifrado, pero probablemente necesitaría mantener la clave de cifrado en la sesión mientras el usuario está conectado.
¿Es esta una buena solución? ¿Hay otras soluciones que debería considerar en su lugar?
También apreciaría cualquier puntero a las aplicaciones de código abierto existentes que hacen este tipo de cosas correctamente.
Editar (20 de diciembre de 2011):
Intentaré aclarar lo que estoy buscando.
Google App Engine admite dos funciones: usuarios y administradores. En este caso, un usuario es cualquiera que elige iniciar sesión en el sitio a través de OpenId. Un administrador es un tipo especial de usuario que también obtiene acceso a la consola administrativa de la aplicación. Entre otras cosas, los administradores pueden ver los registros y manipular directamente el almacén de datos de back-end (lectura y escritura). Algunos administradores, llamémoslos administradores / desarrolladores, también tienen la capacidad de implementar un nuevo código.
Se puede esperar que los usuarios creen contenido público y privado. Quiero que los usuarios se sientan seguros de que el contenido que marcan como "privado" no puede ser visto por nadie más.
Reconozco que un administrador / desarrollador malicioso podría cargar un código con una puerta trasera para burlar el diseño de privacidad. Sin embargo, ese problema tendrá que resolverse a través de la auditoría. Debido a que el código es de código abierto, los usuarios preocupados por la implementación del software tienen la oportunidad de revisar el código y convencerse de su integridad.
También reconozco que una gran parte de este derecho es simplemente un buen diseño de la aplicación. Por ejemplo, el back-end debe requerir autenticación y no debe permitir que los usuarios autenticados vean datos que no son de su propiedad. También debe haber una cobertura de prueba suficiente para confirmar que esta funcionalidad funciona según lo previsto. Esta parte del diseño de la aplicación ya está en su lugar.
Cuando hice esta pregunta, esperaba encontrar una solución que ofreciera un mayor nivel de seguridad. Estoy buscando un diseño que proteja, tanto como sea práctico, contra usuarios malintencionados, administradores maliciosos y errores de software no intencionales en los sistemas que controlo. Si al mismo tiempo, esta solución también ofrece cierta protección contra proveedores de sistemas malintencionados o incompetentes (es decir, el personal de Google busca cosas que no deberían, o errores de App Engine que revelan inadvertidamente mis datos), eso es aún mejor.
Me doy cuenta de que no puedo protegerme contra todos los vectores de ataque en una aplicación como esta, y ciertas soluciones serán demasiado feas, o demasiado molestas desde la perspectiva del usuario, para ser prácticas. Puede que no haya una solución que sea "mejor" que la que ya he implementado. En ese caso, me gustaría documentar el razonamiento detrás de esa conclusión. Sin embargo, si hay una solución razonable, me gustaría encontrarla.