如何避免在Google云端存储中将用户ID用作用户文件夹名称?

时间:2017-01-18 04:51:48

标签: python google-app-engine google-cloud-storage

这在Google Cloud Storage Naming Best Practices文档中说明。

  

不要在存储桶或对象名称中使用用户ID,电子邮件地址,项目名称,项目编号或任何个人身份信息(PII),因为任何人都可以探测存储桶或对象的存在,并使用403 Forbidden ,404 Not Found和409 Conflict错误以确定存储桶或对象的名称。此外,URL通常最终会出现在缓存,浏览器历史记录,代理日志,快捷方式以及其他允许轻松读取名称的位置。

这种方式给我的应用程序带来了压力,以及它是如何构建的。我真的想避免通过CloudSQL或DataStore处理/存储云存储路径。

我是在Google App Engine上用Python编写的,我的GCS代码很大程度上取决于用户名。例如,用户总是将他/她的文件上载到他/她已注册的文件夹(用户名)中。我目前拥有的许多路径逻辑都使用GCS的User变量。

有人可能会建议我遵循他们的指导方针,同时仍然能够使用单个变量来调用用户目录吗?我的意思是没有将文件夹指定为用户ID。我需要能够在任何给定时间访问此变量而无需访问SQL或数据存储区。

任何帮助都会非常感谢!

1 个答案:

答案 0 :(得分:0)

用户名和文件名可以有PII。例如:JeffreyRennieHasWarts.pdf。所以他们都必须隐藏起来。

一种方法是加密对象名称。好消息是谷歌刚刚宣布了一项密钥管理服务,这使得这更容易。看到: https://cloud.google.com/kms/

jterrace提到的另一种方法是对用户名进行加盐和散列以创建用户密钥。它看起来像是:

user_key = hmac.new("username", mysecretsalt, hashlib.sha256).hexdigest()

但是仍然存在文件名问题。要隐藏原始文件名,您必须为对象提供无意义的名称,并存储一个单独的对象,其内容是文件的原始名称。所以你的对象名称可能看起来像

userkey1/GUID1.contents
userkey1/GUID1.name
userkey1/GUID2.contents
userkey1/GUID2.name
userkey2/GUID3.contents
userkey2/GUID3.name

最佳选择取决于您计划如何查询存储在云存储中的数据。