当加密令牌以字符串形式存在时,如何解密 java 中使用 JWE 加密的 JWT?
How to decrypt a JWT, in java, which is encrypted with JWE when the encrypted token is present in form of 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 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 and an example to unencrypted JWE tokens can be found at the bottom of this page。
注意:我还没有测试过这个库,所以除此之外我不会有太大用处,但它看起来相当简单。
您与我们分享的断言是在 its compact representation 中序列化的 JWE。它有 5 个部分,用点 (.
) 分隔,它们是:
- 第 1 部分:header (
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
)
header表示至少
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 资源会帮助您,因为您的令牌所使用的算法似乎是受支持的。
我有一个字符串格式的令牌,例如:
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");
https://jwt.io 有一个不错的小解密器供您测试数据
关于 JWE,我唯一能找到的库是 this and an example to unencrypted JWE tokens can be found at the bottom of this page。
注意:我还没有测试过这个库,所以除此之外我不会有太大用处,但它看起来相当简单。
您与我们分享的断言是在 its compact representation 中序列化的 JWE。它有 5 个部分,用点 (.
) 分隔,它们是:
- 第 1 部分:header (
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
)
header表示至少
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 资源会帮助您,因为您的令牌所使用的算法似乎是受支持的。