2

是否可以保存以公开 Google Datastore 中数据的实体 ID。例如,在我的代码中,我有具有此 ID 的实体:

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

id 将与此类似:agptZeERtzaWYvSQadLEgZDdRsUYRs

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

4

3 回答 3

2

该实体 ID 包含对象 ID、应用程序 ID 和对象类名称。它只是一个编码字符串。并不是真正的任何安全风险。

于 2009-07-15T18:52:38.563 回答
1

您可以使用 KeyFactory 转换为 keytoString、stringToKey 如下 URL Google App Engine

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

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

使用编码键字符串时,您可以通过附加字段提供对对象字符串或数字 ID 的访问。

我希望它有所帮助。

老虎。

于 2009-07-11T16:15:43.293 回答
0

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

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

您唯一需要直接访问此字段的情况是,如果您绝对不在乎数据的名称,{当您需要程序找到它,但人类不会通过猜测单词来搜索它文本框},或者当您想要拥有多个具有相同类型和名称的对象时{也许使用版本 int?},那么您应该使用编码键语法。无论您在类中放置一个字段,KEY 和 ID 都存在于数据库中,使用编码的键语法只会让您访问该值。

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

向上和向下发送编码的密钥可能比未编码的密钥需要更多的带宽{除非你像我一样在命名事物上啰嗦!}; 但它减少了 appengine 上的 CPU 周期,让你的配额更快乐,每个人的应用程序运行速度都快一点!

这个密钥,即使以某种方式未散列,也只会暴露与您创建 PrimaryKey 一样敏感的数据。不涉及您的应用程序密码,也不会涉及任何健全的数据模型中的用户密码。如果您使用提供的 User 类进行身份验证,或者您在源代码中使用的类名,那么 {BIG 可能} 泄漏的唯一可能是用户电子邮件地址。

...基本上,只有在观看一两个萤火虫请求时已经可用的信息可能会被公开。

于 2009-08-18T13:26:53.063 回答