在java中,当加密的令牌以字符串的形式存在时,如何解密JWT(用JWE加密)?

在java中,当加密的令牌以字符串的形式存在时,如何解密JWT(用JWE加密)?,java,encryption,jwt,jwe,Java,Encryption,Jwt,Jwe,我有一个字符串格式的令牌,例如: eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.K52jFwAQJH-DxMhtaq7sg5tMuot_mT5dm1DR_01wj6ZUQQhJFO02vPI44W5nDjC5C_v4pW1UiJa3cwb5y2Rd9kSvb0ZxAqGX9c4Z4zouRU57729ML3V05UArUhck9ZvssfkDW1VclingL8LfagRUs2z95UkwhiZyaKpmrgqpKX8azQFGNLBvEjXnxx

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

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

现在我想通过一些java库对这个字符串进行解密,并最终访问有效负载。到目前为止有人这样做过吗?

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

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");
有一个很好的小解密程序供你测试数据

关于JWE,我能找到的唯一库是,未加密JWE令牌的示例可以在的底部找到。

注意:我还没有测试这个库,所以除此之外我不会有太多用处,但它看起来相当简单。

您与我们共享的断言是在中序列化的JWE。它有5个由点(
)分隔的部分,它们是:

  • 第1部分:标题(
    EYJHBGCOIJSU0ETT0FFUCISIMVUYYI6IKEXMJHHQ00IFQ
  • 第2部分:加密密钥-根据算法,它可能是空字符串-【参考参考,【代码:【代码:【代码:【代码:【代码:【代码:【代码:【代码:【代码:【代码:【代码:【代码】KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBOCRZJ6N38x5URVFFE5SDPHDGSNLAde>)
  • 第3部分:初始化向量-IV根据算法,它可能是空字符串-(
    gjI_RIFWZXJwaO9R
  • 第4部分:密码文本(
    oaE5a-Z0N1MW9FBKKEFA5E7HXVxOUANZSNMBYYT8G\u xlXkMD0nz4fIaGtuWd3t9Xp-KUFVFD-xOnAs2SBX\u Y1KYGPTO4MIBJIRXQEJDSKYKWNDXZRUTN9CSMFWQWHX1SLHMPJKGSNF9YWBKW5KRX23IHODGOSQUYUXN0WKWKWKUQ0WKUQH1R3Z-Fluus6SX9Q9QX9QX9QX9QXX9QXX8NFV8M9NF2BWK8M9UK8MKKKKK8M9N8MKKKKKKKKW9NKKWKKKKKKKKKKKKKKKKK9
  • 第5部分:附加认证数据-AAD-(
    sOLijuVySaKI FYUaBywpg
标题至少指示

  • 用于加密内容加密密钥(CEK)
  • 与CEK一起用于加密内容
在您的情况下,
alg
RSA-OAEP
enc
A128GCM
。 根据这些算法,您应该拥有一个RSA私钥来解密CEK,然后使用它来解密密码文本

在接受的答案中提到的将没有用处,因为它不支持JWE,但支持JWS。使用JWE输入显示的结果不会给您解密的负载。
但是,该资源将帮助您,因为您的令牌所使用的算法似乎是受支持的。

是的,但这是用JWE加密的JWT,因此将有5个部分,如splitToken[0]、[1]、[2]、[3]、[4]@HasebAnsari我已经更新了JWE的答案。祝你好运!解释得很好……我找到了这个connect2id nimbus库……现在的问题是我有一个256 GCM的512位密钥……无论如何,这是可能的。要获得CEK,你必须先解码它(Base64UrlSafe=>二进制字符串)然后使用RSA-OAEP算法和解码的IV对其进行解密。通常,使用A256GCM算法,解密的CEK应为256位字符串。我们可以讨论。是否有可能将该字符串解密为JWT格式?