2017-03-28 17 views
0

サービスによって生成されたJWTトークンがJavaアプリケーションで検証されています。Java(JJWT)で異なる方法でデコードされたBase64

問題は、JJWTライブラリがbase64の間違ったデコードによってJSONヘッダーを解析できないことです。

ヘッダをBase64コード:JJWTによってデコードeyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRva2VuLXNpZ25pbmcifQ

は(呼び出し元に沸く: new String(javax.xml.bind.DatatypeConverter.parseBase64Binary(myBase64), java.nio.charset.Charset.forName("UTF-8")))):

{"alg":"RS256","typ":"JWT","kid":"token-signing" 

だから、最後の中括弧が失われました。

しかし、私は他のデコーダ(https://www.base64decode.org/)と一緒に試してみました - 最後の中括弧が所定の位置にあります。

他の開発者にとっても、同じコードを使用していました。

JavaのBase64デコードに影響する環境には何かがありますか?

答えて

1

JWTのヘッダとペイロードがBASE64より若干異なるをコードBASE64のURLである(-_\+置き換え、=末尾の除去)ヘッダを復号するために、このコードDatatypeConverter.parseBase64Binaryを使用

を間違っている。

java.util.Base64.getUrlDecoder().decode(string); 

私はJJWTのコードを見直し、正しい方法でヘッダを解読しました。 DefaultJWTSParserラインを見てください255

String origValue = TextCodec.BASE64URL.decodeToString(base64UrlEncodedHeader); 

あなたが他のライブラリを使用していることができますか?

1

受信したヘッダーはBase64 without output paddingです(ただし、66文字は4の倍数ではありません)。 DatatypeConverter.parseBase64BinaryはXMLスキーマxsd:base64Binaryの型をパースするように指定されています。requires output paddingです。どうやら、末尾のパディングされていない文字を無効として扱い、無視するだけです。

いずれ異なるデコーダを使用する(ジャワ8はGuava has one tooApache Commons.Codec has onejava.util.Base64有する)、または「=」それまでとパッド出力自身(すべての非のBase64文字を除去した後、文字列の長さが4で割り切れない場合には、パッド)です。

関連する問題