2

我们有一个远程应用程序向我们发送 JWT。他们使用“RSA-OAEP-256”算法和“A256CBC-HS512”加密以及我们的公钥对令牌进行编码,现在我正在尝试对其进行解密并解析声明。我用 生成了密钥openssl rsa -in <myPrivateKey> -pubout -out <myPublicKey>,然后根据此 SO帖子myPrivateKey的建议转换为 .der 。按照nimbus的指南,我想出了以下内容。

    @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为空,但我不知道是否应该在解密之前填充它。

我是否需要以不同的方式生成密钥,还是我省略了另一个步骤?我需要在某处指定算法,还是使用不同的解密器方法/类?

4

1 回答 1

4

事实证明,我使用的是对称密钥而不是公钥/私钥解密的方法。以下成功处理解密并允许我查看声明。

    @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();
    }
}
于 2017-04-05T20:07:58.610 回答