Как расшифровать JWT с помощью закрытого ключа RSA

У нас есть удаленное приложение, отправляющее нам JWT. Они использовали алгоритм "RSA-OAEP-256" и шифрование "A256CBC-HS512" и наш открытый ключ для кодирования токена, и сейчас я пытаюсь расшифровать его и проанализировать заявки. Я сгенерировал ключи с openssl rsa -in <myPrivateKey> -pubout -out <myPublicKey>тогда я перевел myPrivateKey к.der на основе предложения этого SO поста. Следуя руководству в 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 является нулевым, хотя я не знаю, должно ли это быть заполнено перед расшифровкой.

Нужно ли генерировать ключ по-другому, или есть другой шаг, который я пропустил? Нужно ли где-то указывать алгоритм или использовать другой метод / класс расшифровки?

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();
    }
}
Другие вопросы по тегам