我們有一個遠程應用程序向我們發送JWT。他們使用「RSA-OAEP-256」算法和「A256CBC-HS512」加密和我們的公鑰來對令牌進行編碼,現在我試圖解密並解析這些聲明。我使用openssl rsa -in <myPrivateKey> -pubout -out <myPublicKey>
生成密鑰,然後根據此SO post的建議將myPrivateKey
轉換爲.der。按照nimbus的指南,我想出了以下內容。如何使用RSA私鑰解密JWT
@Test
public void testDecryptJwtWithRsa() {
String filename = <myPrivateKey.der>;
String tokenString = <encryptedTokenString>;
try {
byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pk = kf.generatePrivate(spec);
byte[] encodedPk = pk.getEncoded();
JWEObject jweObject = JWEObject.parse(tokenString);
jweObject.decrypt(new DirectDecrypter(encodedPk));
SignedJWT signedJWT = jweObject.getPayload().toSignedJWT();
String jsonToken = jweObject.getPayload().toJSONObject().toJSONString();
System.out.println(jsonToken);
} catch (Exception e) {
System.out.println(e.getMessage());
Assert.fail();
}
}
的爲java.security.PrivateKey分析正確,但我在jweObject.decrypt(new DirectDecrypter(encodedPk));
得到一個錯誤:
The Content Encryption Key length must be 128 bits (16 bytes), 192 bits (24 bytes), 256 bits (32 bytes), 384 bits (48 bytes) or 512 bites (64 bytes)
而且,在調試器,我可以看到,jwe.payload
是空的,雖然我不知道這是否應該在解密之前填充。
我是否需要以不同的方式生成密鑰,還是有另一個步驟,我省略了?我需要在某處指定算法,還是使用不同的解密方法/類?