Как расшифровать 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();
}
}