为什么我的Jose4j JSON Web Key导致此InvalidKeyException?

时间:2017-05-03 10:38:29

标签: java json encryption jwt jose4j

我正在使用Jose4j在Java中执行JSON Web令牌的加密。

我以JSON格式创建一个键作为String传递给JsonWebKey.Factory.newJwk方法,因此:

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

我将它传递给工厂并获得JsonWebKey (jwk)回复。 然后将密钥(从jwk.getKey()方法)传递给JsonWebEncryption的setKey()方法。 我设置了AlgorithmHeaderValueEncryptionMethodHeaderParameter ...

然后,当我调用jwe.getCompactSerialization()时,它会抛出以下异常

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

我传入了16个字节,所以为什么这个值为128位?

2 个答案:

答案 0 :(得分:0)

在将密钥字符串添加到JSON对象jwkJson之前,需要对其进行base64编码。

E.G。

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

在JsonWebKey的工厂方法中,在从JSON对象检索了key(k)值之后,它对它进行了解码。这有效(如果你没有先编码)将位模式所代表的字符数减少3。

至于为什么会这样,我有点困惑。我假设如果您使用8位表示形式(UTF-8,Java中的本机字符集)使用描述字符串的二进制字符串,则使用6位表示法将该二进制字符串重新解释为字符(base64) ,会产生更长的字符串!

答案 1 :(得分:0)

" oct"用于对称密钥base64url的JWK密钥类型对" k"的值的密钥值进行编码。参数(见https://tools.ietf.org/html/rfc7518#section-6.4)。而" 5uP3r53cR37k3yPW"是16个字符,它使用base64url字母表,并在处理为JWK键值时解码为12个字节(96位)的原始数据。 k值需要更长一点才能表示16字节/ 128位。例如,像String jwkJson = "{\"kty\":\"oct\",\"k\":\"5uP3r53cR37k3yPWj_____\"}";这样的东西是一个128位对称的JWK,可以与你正在做的事情一起工作。但是,加密密钥确实应该使用安全的随机数生成而不是看起来像密码的东西。 FWIW,JsonWebKey jwk = OctJwkGenerator.generateJwk(128);是生成128位对称JWK对象的一种方便方法。