Java中(JJWT),Base64解码存在差异

3

我有一个由某个服务生成的JWT令牌,然后在我的Java应用程序上进行验证。

问题在于JJWT库无法解析JSON头部,因为base64解码错误。

头部Base64代码:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRva2VuLXNpZ25pbmcifQ

通过JJWT解码(归结为调用: 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解码出现问题吗?

2个回答

4
你收到的头部是Base64 没有输出填充(请注意,有66个字符,不是4的倍数)。 {{link2:DatatypeConverter.parseBase64Binary}}被指定为解析XML Schema xsd:base64Binary类型,该类型需要输出填充。 显然,它将末尾未填充的字符视为无效,并简单地忽略它们。
要么使用不同的解码器(Java 8有 java.util.Base64, Apache Commons.Codec也有一个, Guava也有一个),要么自己填充输出(如果删除所有非Base64字符后的字符串长度不能被4整除,则用“=”填充)。

3

JWT的头部和负载是base64 url编码的,这与普通的base64略有不同(将+\替换为-_,并删除尾随的=)。

使用代码DatatypeConverter.parseBase64Binary来解码头部是错误的。需要使用:

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

我已经查看了JJWT代码,并以正确的方式解码了头部。请参见DefaultJWTSParser第255行。
String origValue = TextCodec.BASE64URL.decodeToString(base64UrlEncodedHeader);

也许你正在使用其他库?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接