2017-04-05 312 views
0

我們有一個遠程應用程序向我們發送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是空的,雖然我不知道這是否應該在解密之前填充。

我是否需要以不同的方式生成密鑰,還是有另一個步驟,我省略了?我需要在某處指定算法,還是使用不同的解密方法/類?

回答

1

原來,我使用的是使用對稱密鑰而不是公共/私人解密的方法。以下處理成功解密,並允許我查看索賠。

@Test 
public void decryptBlazemeterJwt() { 
    try { 
     byte[] keyBytes = Files.readAllBytes(new File(filename).toPath()); 
     PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PrivateKey pk = kf.generatePrivate(spec); 
     EncryptedJWT jwt = EncryptedJWT.parse(tokenString); 
     RSADecrypter decrypter = new RSADecrypter(pk); 
     jwt.decrypt(decrypter); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     Assert.fail(); 
    } 
}