我们的谷歌应用引擎应用程序存储了大量的个人识别信息(电子邮件、ssn 等)来识别用户。我正在寻找有关如何保护这些数据的建议。
我现在的策略
以两种形式存储敏感数据:
- 散列 - 使用 SHA-2 和盐
- 加密 - 使用公钥/私钥 RSA
当我们需要进行查找时:
- 查找散列数据(在查询中散列 PII,将其与数据存储中的散列 PII 进行比较)。
如果我们需要重新散列数据或以原始形式处理它:
- 使用我们的私钥解密加密版本。永远不要以原始形式存储它,只需处理它然后重新散列和重新加密它。
我的担忧
保守我们的哈希盐秘密
如果攻击者掌握了数据存储中的数据以及我们的哈希盐,我担心他们会暴力破解敏感数据。其中一些(如 SSN,一个 9 位数字)没有大的密钥空间,所以即使使用现代哈希算法,我相信如果攻击者知道盐,它也可以完成。
我目前的想法是将盐排除在源代码控制之外并保留在它自己的文件中。该文件在部署期间被加载到 GAE 中,应用程序在需要散列传入数据时读取该文件。
在部署之间,salt 文件保存在受愤怒熊(或保险箱)保护的 USB 密钥上。
与盐只生活在两个地方
- USB 密钥
- 部署到谷歌应用
并且由于永久禁用了代码下载,我想不出一种方法可以让某人在不窃取该 USB 密钥的情况下获得盐分。我错过了什么吗?
保密我们的私有 RSA 密钥
少担心这个。我们很少需要解密加密版本(仅当我们更改哈希算法或数据格式时)。
私钥永远不必接触 GAE 服务器,我们可以拉下加密数据,在本地解密,处理它,然后重新上传加密/散列版本。
我们可以将我们的 RSA 私钥保存在由熊和老虎守卫的 U 盘上,并且仅在需要时才将其取出。
我意识到这个问题并不完全是谷歌应用程序特有的,但我认为 GAE 使这种情况有些独特。
如果我有完全的控制权,我会做一些事情,比如通过双重身份验证锁定部署访问和对数据存储查看器的访问,但这些选项目前不可用(拥有 GAE 特定密码很好,但我喜欢涉及 RSA 令牌)。
我既不是 GAE 专家也不是安全专家,所以如果我遗漏了一个漏洞或者我没有想到特定于平台的东西,我很想听听。