如何从Java加密GAE查询游标

时间:2013-12-18 22:38:15

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

我想根据gae docs向客户端传递一个查询游标(一个大约120长度的Web安全字符串):

  

警告:将数据存储区光标传递给客户端时要小心   就像在网络表格中一样。虽然客户端无法更改游标值   要访问原始查询之外的结果,它是可能的   解码光标以暴露有关结果实体的信息,例如   作为应用程序ID,实体种类,密钥名称或数字ID,祖先   密钥和查询的过滤器和排序顺序中使用的属性。如果   您不希望用户有权访问该信息,您可以   加密光标,或存储它并为用户提供不透明   键。

实现这一目标的好方法是什么?我希望低cpu成本不是那么强大的密码/加密算法,它将加密字符串保持为Web安全字符串。

2 个答案:

答案 0 :(得分:2)

  

“存储它并向用户提供不透明的密钥。”

我只是存储它并给客户端一个密钥。

如果你对它是一个临时的事情感到满意,你可以把它放在memcache中来节省金钱/时间。

答案 1 :(得分:2)

要稍微简化答案,将光标存储在数据存储区中并将不透明的密钥传递给 ,这是一个很好的方法。但是,这种方法需要支付更多的数据存储操作。

替代方法是对游标进行加密/解密,也不是免费的。您将需要实例时间来加密和解密密钥。

如果您需要对称密钥加密,则默认选择为AES。它快速且被广泛接受为安全的。 javax.crypto库已在App Engine上列入白名单,因此您可以使用它们。这是一个应该做你想做的快速片段:

String password = "some value";
byte[] passwordBytes = password.getBytes(); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(passwordBytes, "AES")); 
byte[] encryptedBytes = cipher.doFinal(cursor.toWebSafeString().getBytes());

哪种方法更便宜取决于很多事情,你必须自己做分析。除了加密或数据存储之外,使用memcache可能会使事情变得更便宜。