java解码JWT

时间:2013-05-26 11:23:41

标签: android-pay jwt

我在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字符串中的密钥本身 - 这没有任何安全意义!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

当你说DECODE时,你的意思是什么?

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

JWT被视为一种魔力。但它不是,因为客户端只是包含一些信息的普通令牌。

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

此处:http://jwt.io/

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

信息和标题是纯粹的base64,您可以自由阅读它们。本网站上的演示显示使用给定的SECRET密码生成jwt。如果您修改信息部分,则会重新签名令牌。只有在知道此密码的情况下才能验证令牌。

我最喜欢的文章有很好的java评论:http://blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/

答案 2 :(得分:0)

免责声明:我是一个的Java开发人员,所以这是基于我的(非Java-dev)读取源代码.. 我也不使用您引用的示例

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

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

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

看起来像样本:

    index.jsp中的
  1. 处理GET请求(Main_Servlet.java)并构建JWT
  2. 调用Google方法发送POST请求以启动购买流程
  3. 示例中没有可以看到的代码,供您的听众处理来自Google的包含JWT订单的帖子 - 您需要编写该代码(是的,您需要验证来自谷歌的JWT。)

    Hth - 如果我对阅读来源有误,我可能就是。