加密App Engine上的用户数据

时间:2011-05-18 06:24:03

标签: security google-app-engine google-cloud-datastore

我正在编写一个网络和Android应用程序,允许用户存储和访问一些潜在的私人数据。通过RPC传输此数据已受SSL保护。我目前正在将这段数据存储在Text属性中,没有任何加密。我现在正在寻找更好地保护数据存储的方法。

问题1 :是否有任何关于加密App Engine上存储数据的一般最佳做法或技巧?

我的一个想法是将属性切换到Blob字段,仅通过线路传输加密数据,并在客户端(在Javascript和Android上)进行解密和加密。

对于加密密钥,我正在考虑使用UserService提供的登录用户的电子邮件地址。用户电子邮件地址仅在用户登录时才知道,并且敏感实体没有引用用户的电子邮件地址 - 仅提供用户ID。

问题2 :用户电子邮件地址作为加密密钥有意义吗?如果没有,加密密钥的其他众所周知的选项是什么?

2 个答案:

答案 0 :(得分:8)

我不确定你从中获得了多少好处。通过SSL传输数据当然是个好主意。如果您存储未加密的用户数据,则有人仍然必须先访问您的数据存储区才能劫持任何内容。如果基于用户对象的属性加密数据,则必须在客户端加密/解密代码中公开该关系,因此这基本上是公开的。获得对您的数据存储区和App Engine源的访问权限的人仍然可以解密所有内容,这只是比较棘手。

一种替代方法是在服务器端存储加密密钥,但需要采取一些额外步骤来保护它。 Permanently prohibit code downloads。将加密密钥保留在源中,而不是数据存储区中,而不是源代码管理中。将其粘贴在USB密钥上,编写一个自定义部署包装器,在最后一刻将密钥注入代码,部署,然后清理代码。这样,获得应用程序管理员权限并访问源代码管理的用户仍然无法解密用户数据。您的部署计算机仍然容易受到攻击,但您已经减少了攻击空间。

如果您想更进一步,请让用户生成自己的加密密钥,并将其存储在客户端。切勿将它们传输到服务器。攻击者仍然可以针对一个用户,但包括您在内的任何人都无法集中解密用户数据。如果用户丢失了自己选择的密钥,他们的数据将永远丢失。

答案 1 :(得分:0)

将属性更改为Blob确实是一个好主意,在这种情况下,加密和解密将很容易。使用一些默认库来加密数据。转到下一点,使用电子邮件作为加密密钥确实是一个坏主意,您应该使用用户对象中可用的User_id,这是非常独特的。