Как расшифровать JWT в Java, который зашифрован с помощью 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 и в конечном итоге хочу получить доступ к полезной нагрузке. Кто-нибудь делал это до сих пор?

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, единственная библиотека, которую я смог найти, - это, и пример незашифрованных токенов JWE можно найти внизу этой страницы.
Примечание: я не тестировал эту библиотеку, поэтому я не буду особенно полезен, но она кажется довольно простой.

Утверждением, которым вы поделились с нами, является 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)

Заголовок указывает, по крайней мере,

  • Key Encryption Algorithm ( alg ) используется для шифрования ключа шифрования содержимого (CEK)
  • Content Encryption Algorithm ( enc ) используется вместе с CEK для шифрования контента.

В вашем случае alg является RSA-OAEP и enc является A128GCM, В соответствии с этим алгоритмом у вас должен быть закрытый ключ RSA для расшифровки CEK, а затем использовать его для расшифровки шифротекста.

Упомянутый в принятом ответе https://jwt.io/ будет бесполезен, так как не поддерживает JWE, но JWS. Результат, показанный на входе JWE, не даст вам расшифрованную полезную нагрузку. Однако ресурс https://connect2id.com/products/nimbus-jose-jwt поможет вам, так как кажется, что алгоритмы, используемые для вашего токена, поддерживаются.

Другие вопросы по тегам