[英]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.Base64
, Apache Commons.Codec具有1 , Guava也具有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.