Как расшифровать 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 поможет вам, так как кажется, что алгоритмы, используемые для вашего токена, поддерживаются.