17

我们的谷歌应用引擎应用程序存储了大量的个人识别信息(电子邮件、ssn 等)来识别用户。我正在寻找有关如何保护这些数据的建议。

我现在的策略

以两种形式存储敏感数据:

  • 散列 - 使用 SHA-2 和盐
  • 加密 - 使用公钥/私钥 RSA

当我们需要进行查找时:

  • 查找散列数据(在查询中散列 PII,将其与数据存储中的散列 PII 进行比较)。

如果我们需要重新散列数据或以原始形式处理它:

  • 使用我们的私钥解密加密版本。永远不要以原始形式存储它,只需处理它然后重新散列和重新加密它。

我的担忧

保守我们的哈希盐秘密

如果攻击者掌握了数据存储中的数据以及我们的哈希盐,我担心他们会暴力破解敏感数据。其中一些(如 SSN,一个 9 位数字)没有大的密钥空间,所以即使使用现代哈希算法,我相信如果攻击者知道盐,它也可以完成。

我目前的想法是将盐排除在源代码控制之外并保留在它自己的文件中。该文件在部署期间被加载到 GAE 中,应用程序在需要散列传入数据时读取该文件。

在部署之间,salt 文件保存在受愤怒熊(或保险箱)保护的 USB 密钥上。

与盐只生活在两个地方

  1. USB 密钥
  2. 部署到谷歌应用

并且由于永久禁用了代码下载,我想不出一种方法可以让某人在不窃取该 USB 密钥的情况下获得盐分。我错过了什么吗?

保密我们的私有 RSA 密钥

少担心这个。我们很少需要解密加密版本(仅当我们更改哈希算法或数据格式时)。

私钥永远不必接触 GAE 服务器,我们可以拉下加密数据,在本地解密,处理它,然后重新上传加密/散列版本。

我们可以将我们的 RSA 私钥保存在由熊和老虎守卫的 U 盘上,并且仅在需要时才将其取出。


我意识到这个问题并不完全是谷歌应用程序特有的,但我认为 GAE 使这种情况有些独特。

如果我有完全的控制权,我会做一些事情,比如通过双重身份验证锁定部署访问和对数据存储查看器的访问,但这些选项目前不可用(拥有 GAE 特定密码很好,但我喜欢涉及 RSA 令牌)。

我既不是 GAE 专家也不是安全专家,所以如果我遗漏了一个漏洞或者我没有想到特定于平台的东西,我很想听听。

4

3 回答 3

11

在决定安全架构时,您首先想到的应该是威胁模型。谁是您的潜在攻击者,他们的能力如何,您如何防御他们?如果对您的威胁模型没有一个清晰的概念,您就无法评估您提议的安全措施是否足够,或者是否有必要。

从您的文字中,我猜您正在寻求防止以下某些子集:

  1. 攻击者会破坏您的数据存储数据,但不会破坏您的应用程序代码。
  2. 获取凭据以访问您的应用程序的管理控制台并可以部署新代码的攻击者。

对于前者,加密或散列您的数据存储数据可能就足够了(但请参阅此答案后面的警告)。防止后者更加困难,但只要您的管理员用户在不部署新应用程序版本的情况下无法执行任意代码,按照您的建议,将您的密钥存储在未签入源代码控制的模块中,应该可以正常工作,因为即使具有管理员访问权限,他们也无法恢复密钥,也无法部署向他们显示密钥的新版本。确保禁用源下载,显然。

您正确地注意到对具有有限熵的数据散列的一些担忧-您的担忧是正确的。在某种程度上,盐可以通过防止预计算攻击来帮助解决此问题,而密钥拉伸(例如 PBKDF2、scrypt 和 bcrypt 中使用的密钥拉伸)可以通过增加攻击者必须做的工作量来使攻击者的生活更加艰难。但是,对于像 SSN 这样的东西,您的密钥空间非常小,以至于没有多少密钥拉伸会有所帮助 - 如果您对数据进行哈希处理,并且攻击者获得了哈希值,他们将能够确定原始 SSN。

在这种情况下,唯一可行的方法是使用密钥加密数据。现在,您的攻击者被迫暴力破解密钥以获取数据,这是一个难度更大的挑战。

简而言之,我的建议是使用标准(私钥)密码加密您的数据,并将密钥存储在不在源代码控制中的模块中。相反,使用散列只会削弱您的数据,而使用公钥加密并不能提供明显的安全性来抵御使用标准密码所没有的任何可能的威胁模型。

当然,保护用户数据的首要方法是尽可能不存储它。:)

于 2012-04-11T01:38:22.387 回答
3

您可以通过使用 HMAC、密钥和每个条目的唯一盐来提高哈希算法的安全性(我知道人们会对此持不同意见,但我的研究认为它有助于避免某些攻击)。您还可以使用 bcrypt 或 scrypt 来散列,这将使反转散列成为一个非常耗时的过程(但您还必须考虑到应用程序计算散列所需的时间)。

通过禁用代码下载并保护您的密钥,我无法想象有人如何获得它。只需确保您的代码受到类似安全防护的保护,或者您在开发期间从代码中删除密钥并仅将其拉出进行部署。我假设您会将您的密钥保存在您的代码中(我听说很多人说将其保存在内存中以确保超级安全,但考虑到 AppEngine 和实例的性质,这是不可行的)。

更新:请务必为对您的应用拥有管理员权限的所有 Google 帐户启用 2 因素身份验证。谷歌提供此功能,因此不确定您启用此功能的限制是否是由外部力量强加的。

于 2012-04-10T22:38:42.950 回答
1

在数据存储上加密数据的有趣方法。在经历了这些之后,我想到的一个问题是你如何查询你的哈希数据?您是在使用两个散列的比较还是更细粒度的散列?同样,在对表中的数据进行散列和加密后,如何完成大于值、小于值等操作?

Fine grained hashing meaning, do you hash consecutive bytes of a data stream to get the accumulated hash. i.e hash(abcd) = hash(a,b) + hash (b,c) + etc. This type of hashing would tell how similar the underlying data are rather than a match.

于 2013-07-07T18:12:20.913 回答