如何解密JWT,在java中,当加密的令牌以String的形式存在时,用JWE加密?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解密JWT,在java中,当加密的令牌以String的形式存在时,用JWE加密?相关的知识,希望对你有一定的参考价值。

我有一个String格式的令牌,例如:

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

现在我想通过一些java库解密这个String,并最终想要访问有效负载。到目前为止,有人这样做过

答案

您可能不一定需要库:

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,并且可以在this page的底部找到未加密的JWE令牌的示例。 注意:我没有测试过这个库,所以除此之外我没什么用处,但看起来相当简单。

另一答案

您与我们分享的断言是在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

标题至少表示

在你的情况下,algRSA-OAEPencA128GCM。根据这些算法,你应该有一个RSA私钥来解密CEK,然后用它来解密密文。

在接受的答案中提到的https://jwt.io不会有用,因为它不支持JWE,而是JWS。使用JWE输入显示的结果不会为您提供解密的有效负载。但是,https://connect2id.com/products/nimbus-jose-jwt资源将帮助您,因为似乎支持用于您的令牌的算法。

以上是关于如何解密JWT,在java中,当加密的令牌以String的形式存在时,用JWE加密?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Thinktecture Identity Server 中加密 JWT 令牌?

用于以JWE JSON序列化格式解析JWT令牌的Java库

成功解密 JWT 令牌能否保证消息的真实性并使签名变得无用?

为啥 JSON Web Token (JWT) 在不知道密钥的情况下解密

token令牌和jwt

在每个API调用之前验证JWT令牌