如何在Java中解密JWT,该JWA被JWE加密时,以弦的形式存在加密令牌



我具有字符串格式的令牌,例如:

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

现在,我想通过一些Java库解密此字符串,并最终想访问有效载荷。有人这样做了吗?

您与我们共享的断言是在其紧凑的表示中序列化的。它的5个部分由DOT(.)隔开:

  • 第1部分:标题(eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ
  • 第2部分:加密键 - 取决于算法,它可能是一个空字符串 - ( K52jFwAQJH-DxMhtaq7sg5tMuot_mT5dm1DR_01wj6ZUQQhJFO02vPI44W5nDjC5C_v4pW1UiJa3cwb5y2Rd9kSvb0ZxAqGX9c4Z4zouRU57729ML3V05UArUhck9ZvssfkDW1VclingL8LfagRUs2z95UkwhiZyaKpmrgqpKX8azQFGNLBvEjXnxxoDFZIYwHOno290HOpig3aUsDxhsioweiXbeLXxLeRsivaLwUWRUZfHRC_HGAo8KSF4gQZmeJtRgai5mz6qgbVkg7jPQyZFtM5_ul0UKHE2y0AtWm8IzDE_rbAV14OCRZJ6n38X5urVFFE5sdphdGsNlA
  • 第3部分:初始化向量-IV 取决于算法,它可能是一个空字符串 - ( gjI_RIFWZXJwaO9R
  • 第4部分:Cyphertext(oaE5a-z0N1MW9FBkhKeKeFa5e7hxVXOuANZsNmBYYT8G_xlXkMD0nz4fIaGtuWd3t9Xp-kufvvfD-xOnAs2SBX_Y1kYGPto4mibBjIrXQEjDsKyKwndxzrutN9csmFwqWhx1sLHMpJkgsnfLTi9yWBPKH5Krx23IhoDGoSfqOquuhxn0y0WkuqH1R3z-fluUs6sxx9qx6NFVS1NRQ-LVn9sWT5yx8m9AQ_ng8MBWz2BfBTV0tjliV74ogNDikNXTAkD9rsWFV0IX4IpA
  • 第5部分:附加身份验证数据-AAD-(sOLijuVySaKI-FYUaBywpg

标题至少指示

  • Key Encryption Algorithmalg)用于加密内容加密密钥(CEK)
  • Content Encryption Algorithmenc)与CEK结合使用以加密内容。

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

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

您可能不一定需要一个库:

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,我能找到的唯一库是,可以在此页面的底部找到未加密的JWE令牌的示例。
注意:我没有测试过这个库,所以除此之外,我不会有太多使用,但是它似乎很简单。

最新更新