2017-05-03 1 views
0

J'utilise Jose4j pour effectuer le cryptage d'un jeton Web JSON en Java.Pourquoi ma clé Web Jose4j JSON provoque-t-elle cette exception InvalidKeyException?

Je crée une clé en tant que chaîne au format JSON pour passer à la méthode JsonWebKey.Factory.newJwk, ainsi:

String jwkJson = "{\"kty\":\"oct\",\"k\":\"5uP3r53cR37k3yPW\"}"; 

Je passe à l'usine et obtenir un retour JsonWebKey (jwk). Passez ensuite la clé (de la méthode jwk.getKey()) à la méthode setKey() de JsonWebEncryption. Je mis la AlgorithmHeaderValue et EncryptionMethodHeaderParameter ...

Puis, quand je l'appelle jwe.getCompactSerialization() il jette l'exception suivante

org.jose4j.lang.InvalidKeyException: 
    Invalid key for JWE A128KW, expected a 128 bit key but a 96 bit key was provided. 

je suis passé de 16 octets, alors pourquoi cette évaluation 96 bits insted de 128 ??

Répondre

0

Vous devez encoder en base64 la chaîne de clé avant de l'ajouter à l'objet JSON jwkJson.

E.G.

String pass = "5uP3r53cR37k3yPW"; 
    String jwkJson = "{\"kty\":\"oct\",\"k\":\""+ Base64Url.encodeUtf8ByteRepresentation(pass) +"\"}"; 

Dans le procédé de l'usine de JsonWebKey, après avoir récupéré la valeur clé (k) de l'objet JSON, il base64 décode. Cela a pour effet (si vous ne l'avez pas encodé en premier) de réduire le nombre de caractères que le motif de bits représente par 3.

Quant à savoir pourquoi cela se produit, je suis un peu confus. Je suppose que si vous avez pris une chaîne binaire qui décrit une chaîne de caractères en utilisant une représentation 8 bits (UTF-8, le jeu de caractères natif en Java), ré-interpréter cette chaîne binaire en caractères en utilisant une représentation 6 bits (base64) , donnerait une chaîne plus longue!

0

Le type de clé JWK "oct" utilisé pour les clés symétriques base64url code la valeur clé pour la valeur du paramètre "k" (voir https://tools.ietf.org/html/rfc7518#section-6.4). Alors que "5uP3r53cR37k3yPW" est de 16 caractères, il utilise l'alphabet base64url et décode 12 octets (96 bits) de données brutes lorsqu'il est traité comme valeur de clé JWK. La valeur k doit être un peu plus longue pour représenter 16 octets/128 bits. Quelque chose comme String jwkJson = "{\"kty\":\"oct\",\"k\":\"5uP3r53cR37k3yPWj_____\"}";, par exemple, est un JWK symétrique de 128 bits qui fonctionnerait avec ce que vous faites. Cependant, les clés de cryptage doivent être créées en utilisant la génération de nombres aléatoires plutôt que quelque chose qui ressemble à un mot de passe. FWIW, JsonWebKey jwk = OctJwkGenerator.generateJwk(128); est un moyen peut-être pratique de générer des objets JWK symétriques de 128 bits.