Tenemos una aplicación remota que nos envía un JWT. Usaron el algoritmo "RSA-OAEP-256" y el cifrado "A256CBC-HS512" y nuestra clave pública para codificar el token, y ahora estoy tratando de descifrarlo y analizar las afirmaciones. Generé las claves con openssl rsa -in <myPrivateKey> -pubout -out <myPublicKey> , luego convertí myPrivateKey en un .der según la sugerencia de esta publicación SO . Siguiendo la guía en nimbus , se me ocurrió lo siguiente.
@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 se analiza correctamente, pero recibo un error en 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)
Además, en el depurador, puedo ver que jwe.payload es nulo, aunque no sé si esto debería completarse antes del descifrado.
¿Necesito generar la clave de manera diferente o hay otro paso que he omitido? ¿Necesito especificar el algoritmo en alguna parte o usar un método/clase de descifrador diferente?
Resulta que estaba usando los métodos para descifrar con claves simétricas en lugar de público/privado. Lo siguiente maneja el descifrado con éxito y me permite ver los reclamos.
@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(); } }