繁体   English   中英

Java(JJWT)对Base64的解码不同

[英]Base64 decoded differently in Java (JJWT)

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

问题在于,由于对base64的错误解码,JJWT库无法解析JSON标头。

标头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解码吗?

您收到的标头是没有输出填充的 Base64(请注意,有66个字符,不是4的倍数)。 指定DatatypeConverter.parseBase64Binary来解析XML Schema xsd:base64Binary类型,该类型需要输出padding 显然,它将末尾的未填充字符视为无效,而只是忽略它们。

使用其他解码器(Java 8具有java.util.Base64Apache Commons.Codec具有1Guava也具有1 ),或者自己填充输出(如果除去所有非Base64字符后的字符串长度不能被4整除) ,用'='填充,直到它为止。

一个JWT的头和有效载荷是base64编码的URL,这是比BASE64略有不同(替代+\\- _并删除尾随=

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

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

我已经检查了JJWT的代码,并以正确的方式解码了标头。 查看DefaultJWTSParser第255行

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

可能您正在使用其他库?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM