2017-05-03 8 views
0

Josephを使用してJavaでJSON Webトークンの暗号化を実行しています。JosephのWebキーがなぜこのInvalidKeyExceptionを引き起こすのですか?

は、私はこのように、JsonWebKey.Factory.newJwkメソッドに渡すJSON形式の文字列としてキーを作成します。

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

私は工場出荷時にそれを渡し、JsonWebKey (jwk)を取り戻します。 次に、キー(jwk.getKey()メソッドから)をJsonWebEncryptionのsetKey()メソッドに渡します。 私はそれは私が16バイトに渡されたので、なぜこれが96ビットに評価されない128のinsted次の例外

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

をスローjwe.getCompactSerialization()呼び出すとき、私は、その後AlgorithmHeaderValueを設定し、EncryptionMethodHeaderParameter ...

??

答えて

0

JSONオブジェクトjwkJsonに追加する前に、キー文字列をbase64でエンコードする必要があります。

E.G. JsonWebKeyのファクトリメソッドで

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

それはキー(k)はJSONオブジェクトから値を取得した後、それを復号化するbase64で。これは、ビットパターンが表す文字数を3減らすという効果があります(最初にエンコードしていない場合)。

なぜこのようなことが起こるのか、少し混乱します。私は、8ビット表現(UTF-8、Javaのネイティブcharset)を使用して文字列を記述するバイナリ文字列を取った場合、そのバイナリ文字列を6ビット表現(base64)を使用して文字として再解釈すると、より長い文字列を生成します。

0

対称キーに使用される「oct」JWKキータイプbase64urlは、「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オブジェクトを生成する便利な方法の1つです。

関連する問題