1

我正在用 Java 编码/解码 JWT 字符串……专门用于应用内购买。

我在看这个例子

https://code.google.com/p/gwdg-java/source/browse/src/java/com/google/iapsample/JWT_Handler.java

我可以使用 SIGNING 键将字符串编码为 JWT。

然后我可以通过调用 deserialize() 将 JWT 解码回源字符串。

但是,如果您查看代码 - 您会注意到该方法不使用 SIGNING 键进行解码……但它确实可以正确解码。

使困惑!

是 JWT 字符串本身中的密钥 - 这没有任何安全意义!

4

3 回答 3

3

不要将签名与加密混淆。

密钥用于生成数字签名,稍后将用于验证 JWT 的真实性。

请参阅下面的 JWT 规范以获取示例:

http://tools.ietf.org/id/draft-jones-json-web-token-08.html#rfc.section.3.1

您还可以使用下面的 JWT 解码器来测试您的集成:

https://developers.google.com/commerce/wallet/digital/docs/jwtdecoder

于 2013-05-28T22:14:07.370 回答
1

当你说解码时,你是什么意思?

您可以解码 base64 部分。它可以(而且经常是)用于携带信息。哪个客户端可以使用。用户名、角色和其他公共事物。

JWT 被呈现为某种魔法。但它不是,因为客户端只是带有一些包含信息的普通令牌。

服务器创建此令牌并使用仅在服务器端的密码/密钥对其进行签名。所以服务器创建令牌,只有服务器可以使用这个密码验证它。

这里:http: //jwt.io/

您可以在那里看到标题/信息部分/和哈希/签名。

信息和标题是纯base64,您可以自由阅读。本网站上的演示显示了使用给定的 SECRET 密码生成 jwt。如果您修改信息部分,它将放弃令牌。只有知道此密码才能验证令牌。

我最喜欢的带有漂亮 Java 评论的文章:http: //blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/

于 2015-02-21T20:01:20.210 回答
0

免责声明:我不是Java 开发人员,所以这是基于我(非 Java 开发人员)对源代码的阅读。我也没有使用您引用的示例

  • public String deserialize(String tokenString)正在从 Base64 解码为字符串,并且
  • 看起来它只是为有效载荷(String jwtPayloadSegment = pieces[1];)和
  • 不是为签名(它本来是pieces[2])解析的private String[] splitTokenString(String tokenString)

如上所述,我不是 Java 开发人员,也不使用示例。代码看起来像(再次注意我的免责声明)它只是如何创建请求(发送到 Google)的示例,而不是作为处理程序让您的侦听器验证来自 Google 的传入回调

示例代码应该仍然有助于执行此操作,因为验证时的过程类似 - re: (re) build JWT 签名并将其与传入 POST 请求中的已解析签名进行比较。

看起来像示例:

  1. 在 index.jsp 中,处理 GET 请求 ( Main_Servlet.java) 并构建 JWT
  2. 调用 Google 方法发送 POST 请求以启动购买流程

我可以看到示例中没有代码供您的听众处理来自 Google 的包含订单 JWT 的帖子 - 您需要编写该代码(是的,您需要验证来自 Google 的 JWT)。

Hth - 如果我对源代码的阅读有误,我可能是。

于 2013-05-26T17:05:28.083 回答