我正在为 Google App Engine (GAE) 编写一个开源 Java 应用程序。该应用程序将允许用户创建旨在私有的内容。我想提供合理的保证,没有人(包括我,作为网站管理员)将能够阅读属于其他人的私人内容。 实现这一目标的最佳方法是什么?
该网站将使用 https 提供服务。用户将使用 OpenId 登录我的应用程序,因此我无法控制他们的登录凭据(我没有他们的密码)。
根据我迄今为止所做的研究,我认为一种解决方案可能是使用基于密码的加密密钥对写入 GAE 数据存储的数据进行加密。用户将选择一个单独的密码,仅用于加密他们的私人数据。为了生成加密密钥,我会以某种方式对密码进行哈希处理(也许是 bcrypt?)。然后,写入 GAE 数据存储的数据将使用加密密钥和盐进行加密,盐将与加密的 blob 一起存储。我永远不会永久存储密码或加密密钥,但我可能需要在用户登录时将加密密钥保留在会话中。
这是一个好的解决方案吗?我应该考虑其他解决方案吗?
我也将不胜感激任何指向正确执行此类事情的现有开源应用程序的指针。
编辑(2011 年 12 月 20 日):
我会尽力澄清我在寻找什么。
Google App Engine 支持两种角色:用户和管理员。在这种情况下,用户是选择通过 OpenId 登录站点的任何人。管理员是一种特殊类型的用户,它也可以访问应用程序的管理控制台。除其他外,管理员可以查看日志并直接操作后端数据存储(读取和写入)。一些管理员——我们称他们为管理员/开发人员——也有能力部署新代码。
可以期望用户创建公共和私人内容。我希望用户确信他们标记为“私人”的内容真的不能被其他任何人查看。
我认识到恶意管理员/开发人员可以上传带有后门的代码以规避隐私设计。但是,这个问题必须通过审计来解决。因为代码是开源的,所以关心软件实现的用户有机会审查代码并说服自己相信它的完整性。
我也认识到,要做到这一点,很大一部分只是良好的应用程序设计。例如,后端应该要求身份验证,并且不应该让经过身份验证的用户查看他们不拥有的数据。还应该有足够的测试覆盖率来确认此功能是否按预期工作。这部分应用程序设计已经到位。
当我问这个问题时,我希望找到一个提供更高水平保证的解决方案。我正在寻找一种设计,以尽可能多地保护我控制的系统中的恶意用户、恶意管理员和无意的软件错误。如果同时该解决方案还针对恶意或不称职的系统提供商(即 Google 人员查看他们不应该查看的内容,或无意中泄露我的数据的 App Engine 错误)提供一些保护,那就更好了。
我意识到我无法在这样的应用程序中防御所有攻击向量,并且某些解决方案将太丑陋 - 或者从用户的角度来看太烦人 - 不实用。可能没有比我已经实施的解决方案“更好”的解决方案了。在这种情况下,我想记录下这个结论背后的原因。但是,如果有一个合理的解决方案,我想找到它。