2017-02-27 183 views
1

我有字符串格式的標記,如:如何解密Java中的JWT,當加密的令牌以String形式存在時,JWT使用JWE加密?

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.K52jFwAQJH-DxMhtaq7sg5tMuot_mT5dm1DR_01wj6ZUQQhJFO02vPI44W5nDjC5C_v4pW1UiJa3cwb5y2Rd9kSvb0ZxAqGX9c4Z4zouRU57729ML3V05UArUhck9ZvssfkDW1VclingL8LfagRUs2z95UkwhiZyaKpmrgqpKX8azQFGNLBvEjXnxxoDFZIYwHOno290HOpig3aUsDxhsioweiXbeLXxLeRsivaLwUWRUZfHRC_HGAo8KSF4gQZmeJtRgai5mz6qgbVkg7jPQyZFtM5_ul0UKHE2y0AtWm8IzDE_rbAV14OCRZJ6n38X5urVFFE5sdphdGsNlA.gjI_RIFWZXJwaO9R.oaE5a-z0N1MW9FBkhKeKeFa5e7hxVXOuANZsNmBYYT8G_xlXkMD0nz4fIaGtuWd3t9Xp-kufvvfD-xOnAs2SBX_Y1kYGPto4mibBjIrXQEjDsKyKwndxzrutN9csmFwqWhx1sLHMpJkgsnfLTi9yWBPKH5Krx23IhoDGoSfqOquuhxn0y0WkuqH1R3z-fluUs6sxx9qx6NFVS1NRQ-LVn9sWT5yx8m9AQ_ng8MBWz2BfBTV0tjliV74ogNDikNXTAkD9rsWFV0IX4IpA.sOLijuVySaKI-FYUaBywpg 

現在我想解密通過一些java庫這個字符串,最終要訪問的有效載荷。到目前爲止,任何人都這樣做了

回答

2

你可能不一定需要的庫文件:

String token = eyJ....; 
String[] splitToken = JWTEncoded.split("\\."); 

// splitToken[0] is the header, splitToken[1] is the payload and 
// splitToken[2] is the signature 
byte[] decodedBytes = Base64.decode(splitToken[1], Base64.URL_SAFE); 

// You don't have to convert it to string but it really depends on what type 
// data you expect 
String payload = new String(decodedBytes, "UTF-8"); 

https://jwt.io有一個可愛的小解密您測試數據

在問候JWE我所能找到的唯一庫是this和例如未加密的JWE令牌可以在this page的底部找到。
注意:我還沒有測試過這個庫,所以除了這個之外我不會有太多的用處,但它看起來相當簡單。

+0

是的,但是這是JWE加密的JWT,因此將有5個部分,如splitToken [0],[1],[2],[3],[4]。 –

+0

@HasebAnsari我已經爲JWE更新了我的答案。祝你好運! – bidluo

2

您與我們分享的斷言是its compact representation中的JWE序列化。它有5份由點(.),它們是分離的:

  • 第1部分:頭部(eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ
  • 第2部分:將加密的密鑰 - 取決於算法,它可以是一個空字符串 - (K52jFwAQJH-DxMhtaq7sg5tMuot_mT5dm1DR_01wj6ZUQQhJFO02vPI44W5nDjC5C_v4pW1UiJa3cwb5y2Rd9kSvb0ZxAqGX9c4Z4zouRU57729ML3V05UArUhck9ZvssfkDW1VclingL8LfagRUs2z95UkwhiZyaKpmrgqpKX8azQFGNLBvEjXnxxoDFZIYwHOno290HOpig3aUsDxhsioweiXbeLXxLeRsivaLwUWRUZfHRC_HGAo8KSF4gQZmeJtRgai5mz6qgbVkg7jPQyZFtM5_ul0UKHE2y0AtWm8IzDE_rbAV14OCRZJ6n38X5urVFFE5sdphdGsNlA
  • 3部分:初始化向量 - IV 取決於算法,它可以是一個空字符串 - (gjI_RIFWZXJwaO9R
  • 4部分:密文(oaE5a-z0N1MW9FBkhKeKeFa5e7hxVXOuANZsNmBYYT8G_xlXkMD0nz4fIaGtuWd3t9Xp-kufvvfD-xOnAs2SBX_Y1kYGPto4mibBjIrXQEjDsKyKwndxzrutN9csmFwqWhx1sLHMpJkgsnfLTi9yWBPKH5Krx23IhoDGoSfqOquuhxn0y0WkuqH1R3z-fluUs6sxx9qx6NFVS1NRQ-LVn9sWT5yx8m9AQ_ng8MBWz2BfBTV0tjliV74ogNDikNXTAkD9rsWFV0IX4IpA
  • 5部分:附加認證數據 - AAD - (sOLijuVySaKI-FYUaBywpg

首部指示

  • Content Encryption Algorithm (enc)使用至少

    在你的情況,該algRSA-OAEPencA128GCM。 根據這些算法,你應該有一個RSA私鑰來解密CEK,然後用它來解密這個密文。

    https://jwt.io在接受的答案中提到的將不會有用,因爲它不支持JWE,但JWS。使用JWE輸入顯示的結果不會給您解密的有效負載。 但是,https://connect2id.com/products/nimbus-jose-jwt資源將幫助您,因爲您的令牌所使用的算法似乎都受支持。

  • +0

    很好解釋.....我想出了這個connect2id nimbus庫.....現在的概率是我有512位密鑰爲A256GCM ......我們這可能在任何方面。 –

    +0

    要獲得CEK,必須先解碼(Base64UrlSafe => binary string),然後使用RSA-OAEP算法和解碼的IV對其進行解密。 通常,使用A256GCM算法,解密的CEK應該是256位的字符串。 我們可以[私下討論](https://gitter.im/Spomky)。 –

    +0

    是的,我們可以私下討論它 –