在 Google App Engine 等云环境中保护用户数据的私密性

信息安全 密码学 应用安全 哈希 密码管理 数据库
2021-08-14 00:28:50

我正在为 Google App Engine (GAE) 编写一个开源 Java 应用程序。该应用程序将允许用户创建旨在私有的内容。我想提供合理的保证,没有人(包括我,作为网站管理员)将能够阅读属于其他人的私人内容。 实现这一目标的最佳方法是什么?

该网站将使用 https 提供服务。用户将使用 OpenId 登录我的应用程序,因此我无法控制他们的登录凭据(我没有他们的密码)。

根据我迄今为止所做的研究,我认为一种解决方案可能是使用基于密码的加密密钥对写入 GAE 数据存储的数据进行加密。用户将选择一个单独的密码,仅用于加密他们的私人数据。为了生成加密密钥,我会以某种方式对密码进行哈希处理(也许是 bcrypt?)。然后,写入 GAE 数据存储的数据将使用加密密钥和盐进行加密,盐将与加密的 blob 一起存储。我永远不会永久存储密码或加密密钥,但我可能需要在用户登录时将加密密钥保留在会话中。

这是一个好的解决方案吗?我应该考虑其他解决方案吗?

我也将不胜感激任何指向正确执行此类事情的现有开源应用程序的指针。

编辑(2011 年 12 月 20 日):

我会尽力澄清我在寻找什么。

Google App Engine 支持两种角色:用户和管理员。在这种情况下,用户是选择通过 OpenId 登录站点的任何人。管理员是一种特殊类型的用户,它也可以访问应用程序的管理控制台。除其他外,管理员可以查看日志并直接操作后端数据存储(读取和写入)。一些管理员——我们称他们为管理员/开发人员——也有能力部署新代码。

可以期望用户创建公共和私人内容。我希望用户确信他们标记为“私人”的内容真的不能被其他任何人查看。

我认识到恶意管理员/开发人员可以上传带有后门的代码以规避隐私设计。但是,这个问题必须通过审计来解决。因为代码是开源的,所以关心软件实现的用户有机会审查代码并说服自己相信它的完整性。

我也认识到,要做到这一点,很大一部分只是良好的应用程序设计。例如,后端应该要求身份验证,并且不应该让经过身份验证的用户查看他们不拥有的数据。还应该有足够的测试覆盖率来确认此功能是否按预期工作。这部分应用程序设计已经到位。

当我问这个问题时,我希望找到一个提供更高水平保证的解决方案。我正在寻找一种设计,以尽可能多地保护我控制的系统中的恶意用户、恶意管理员和无意的软件错误。如果同时该解决方案还针对恶意或不称职的系统提供商(即 Google 人员查看他们不应该查看的内容,或无意中泄露我的数据的 App Engine 错误)提供一些保护,那就更好了。

我意识到我无法在这样的应用程序中防御所有攻击向量,并且某些解决方案将太丑陋 - 或者从用户的角度来看太烦人 - 不实用。可能没有比我已经实施的解决方案“更好”的解决方案了。在这种情况下,我想记录下这个结论背后的原因。但是,如果有一个合理的解决方案,我想找到它。

2个回答

你不能。基本上没有技术机制可以阻止您阅读用户的内容,如果您愿意并且是恶意的。

在这里,让我们看一些明显的尝试,并了解为什么它们实际上不起作用:

  • 您可以在程序中硬编码的密钥下加密用户数据,并以加密形式存储在数据库中,以防止您偷看用户数据。但是随后您的代码将具有解密密钥,因此您可以随时查看解密密钥,然后您将能够查看用户数据。不工作。

    (让程序为您生成密钥也不起作用,因为它将在哪里存储密钥以供将来使用?任何可以存储密钥的地方,您都可以阅读。)

  • 您可以要求用户提供密码,从用户的密码中派生加密密钥,使用此密钥加密用户的数据,然后以加密形式将其存储在数据库中。但是随后您的代码会看到解密密钥。你可以修改你的代码来收集和记录用户的密码,然后你就可以读取用户的数据。用户将无法检测到这一点。不工作。

  • 您可以将 Javascript 代码发送到用户的浏览器。Javascript 代码可以提示用户输入密码,从用户的密码中获取加密密钥,并对数据进行加密(所有操作都在浏览器上执行,因此用户的密码永远不会离开浏览器)。然后,Javascript 可以将用户数据以加密形式发送到您的服务器进行存储。这听起来很有吸引力。但是,它存在一个严重的问题。如果您是恶意的或窥探者,您可以轻松地修改您的服务器代码以向用户发送新的 Javascript,它会收集他们的密码并将副本发送到您的服务器。那会让你读取用户的数据。虽然您可能会说“哎呀,我永远不会那样做”,但关键是用户无法检测到这一点,所以他们无法验证你是否诚实,也没有技术机制可以防止你不诚实。不工作。

因此,正如您所看到的,对于这个问题没有真正阻止您读取用户数据的技术解决方案。如果您真的想读取用户数据,您可以,甚至可以以用户不会注意到的方式进行。用户有什么保证你不会这样做?好吧,他们必须相信你是一个诚实的人。技术机制无法解决问题。

现在,仍然有充分的理由进行加密。如果您是诚实的,并且不想保护您的用户免受不诚实版本的影响,而是希望避免您可能犯的无意错误或服务器数据库内容的可能安全漏洞,那么现在,这可能是一个问题至少部分解决了使用加密。

但是您提到的特定问题在实践中并不是仅通过密码学就可以真正解决的问题。

如果您希望用户感到自信,那么只需在整个界面中添加几张挂锁图片即可。这是心理,不是安全以 19 世纪的银行为例,它们总是在新古典主义建筑中建造办公室,大柱石和大理石地板:这是为了让客户在不知不觉中将银行与坚固和长寿的概念联系起来—— 1933 年FDIC成立之前美国的一个重要概念。

如果您想说服精通技术的第三方您没有干扰所谓的“私人用户数据”,那么……您大多不走运。添加加密和哈希将无济于事;作为系统管理员/开发人员,您仍然可以控制并且可以在技术上做任何您想做的事情。堆积层层无根据的密码学只会让你在安全问题上看起来有点无能(至少在 IT 安全专业人士看来),这反过来会降低而不是增加信心。

关于避免错误、漏洞和后门,我们现在能做的最好的事情就是进行大量的审计认真检查服务器源代码。编辑要在服务器上执行的每项管理操作的书面程序,并确保它们得到遵守;即,聘请外部审计员亲自见证所有操作。强制双重控制(如管理员密码长,人们只知道一半,所以需要两个操作员输入密码)。要求所有开发人员和系统管理员获得安全许可(包括债务情况)。有一个称为Webtrust的框架两个重要警告:

  1. 这将是昂贵的、漫长的、复杂得令人难以置信的,并且会永久地粉碎你的灵魂。
  2. 这不好。这只是我们拥有的最好的。