公开Goog​​le Datastore数据的实体ID

时间:2009-07-09 05:42:17

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

是否保存以暴露Google Datastore中的数据的实体ID。 例如,在我的代码中,我有这个id的实体:

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;

id与此类似: agptZeERtzaWYvSQadLEgZDdRsUYRs

任何人都可以从此字符串中提取密码,应用程序URL和任何其他信息吗?那个字符串是什么意思?

3 个答案:

答案 0 :(得分:2)

该实体ID包含对象ID,应用程序ID和对象类名称。它只是一个编码的字符串。实际上没有任何安全风险。

答案 1 :(得分:1)

您可以使用KeyFactory转换为keytoString,stringToKey,如下所示:URL Google App Engine

我认为它是Google App Engine中数据存储的唯一ID。

  

密钥实例可以转换为和   来自编码的字符串表示   使用KeyFactory方法   keyToString()和stringToKey()。

     

使用编码的密钥字符串时,您   可以提供对象的访问权限   字符串或带有的数字ID   其他领域。

我希望它有所帮助。

虎。

答案 2 :(得分:0)

如果你导航到localhost:4321 / _ah / admin,你可以利用sdk数据存储查看器,你会看到每种实体都有一个KEY字段和一个NAME / ID字段;

无论使用long,String还是Key作为@PrimaryKey,都会有一个带有字符串/数字的ID / Name列和一个KEY列,以及所述ID的编码键。正如其他帖子中所提到的,这个编码哈希{md5s,很可能是}你的appspot应用程序id,数据对象的完全限定类名,以及你指定为@PrimaryKey的任何内容。

你唯一想要直接访问这个字段的时间是你绝对不关心数据的名称,{当你需要你的程序找到它时,但人类不会通过猜测来搜索它单词到文本框},或者当你想拥有相同类型和名称的多个对象{可能使用版本int?}时,你应该使用编码的键语法。无论您是否在类中放置字段,都会在数据库中显示KEY和ID,使用编码的键语法只允许您访问此值。

此外,对于使用编码键的应用程序,还有一个可用的速度加值......只有两种类型的查询:SELECT *和SELECT _ _ key _ _ {用于显示有两个_}的空格。对于AJAX应用程序中的大型数据集,分页数据的唯一有效方法是选择所有密钥,将它们发送到客户端,让客户端请求0-> X个记录,为其他X-建立链接> Y结果,并使用第一组完整数据的编码密钥查询服务器,将响应解析为漂亮的小列表,并避免加载不立即有用的397服务器数据对象。

在线路上上下发送编码密钥可能比未编码密钥需要更多的带宽{除非你像我一样在命名事物上啰嗦!};但它会削弱引擎上的cpu周期,让你的配额更快乐,每个人的应用程序运行速度只会快一点!

这个密钥,即使以某种方式不加注意,也只会将数据暴露为与制作PrimaryKey的任何内容一样敏感。您不会涉及应用密码,也不会在任何理智的数据模型中使用用户密码。关于唯一可能{BIG可能}泄漏的事情是用户电子邮件地址,如果您使用提供的User类进行身份验证,或者您在源中使用的类名。

......基本上,只有在观看一两个火虫请求时已经可用的信息才有可能暴露出来。