2013-05-26 68 views
2

我正在編碼/解碼Java中的JWT字符串......專門用於應用內購買。java解碼JWT

我期待在這個例子中

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

我可以編碼使用簽名密鑰字符串智威湯遜。

然後我就可以通過調用反序列化解碼JWT回源字符串()。

但是,如果你看看代碼 - 你注意到該方法不使用 SIGNING鍵來解碼...但它確實解碼正確。

困惑!

是智威湯遜字符串本身中的關鍵 - 這將沒有任何安全感!

回答

0

聲明:我一個一個Java開發,所以這是基於我的(非Java-DEV)讀取源的.. 我也不使用你引用樣品。

  • public String deserialize(String tokenString)從Base64編碼解碼串並
  • 它看起來像它的唯一這樣做的有效載荷(String jwtPayloadSegment = pieces[1];)和
  • 沒有爲簽名解析由private String[] splitTokenString(String tokenString)
  • (它本來 pieces[2]

如上所述,我不是一個Java開發我也不使用樣本。代碼如下所示(再次,注意我的聲明),它僅適用於如何創建一個索取樣品(發送給谷歌)作爲處理程序,爲您的偵聽器,谷歌驗證接收的回調。

的示例代碼仍然應該這樣做,由於驗證時的過程是相似的有益的 - 重(重)建智威湯遜的簽名,並將其與傳入POST請求解析的簽名進行比較。

貌似樣本:

  1. 在index.jsp中,處理GET請求(Main_Servlet.java),並建立了智威湯遜
  2. 調用谷歌的方法來發送POST請求發起購買過程

樣本中沒有代碼,我可以看到這是供聽衆處理來自Google的包含訂單JWT的帖子 - 您需要編寫該代碼(並且您需要驗證JWT來自Google)。

H個 - 如果我錯了,我的源讀,我很可能是。

3

不要混淆加密簽名。

該密鑰用於生成一個數字簽名,稍後將用於驗證智威湯遜的真實性。

請參閱下面的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

+0

是的,關於「後來辨別真僞」 ......也沒有被證明的JWT_Handler.java代碼。 – Cheeso

1

當你說DECODE,你什麼意思?

您可以解碼base64部件。它可以(並且通常是)用於傳輸信息。哪個客戶端可以使用。用戶名,角色和其他公共事物。

智威湯遜是一些魔術。但它不是,對於客戶而言,它只是包含一些信息的普通標記。

服務器創建此令牌並使用僅在服務器端的密碼/密鑰對其進行簽名。因此,服務器創建令牌,並且只有服務器可以使用此密碼對其進行驗證。

這裏:http://jwt.io/

你可以看到有頭/信息的一部分/和哈希/簽名。

信息和標題是純base64,你可以自由閱讀。本網站上的演示顯示使用給定的SECRET密碼生成jwt。如果您修改了信息部分,則會退出令牌。只有知道此密碼時,才能驗證令牌。

我最喜歡的文章與漂亮的Java註釋:http://blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/