首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Base64在Java中的不同解码(JJWT)

Base64在Java中的不同解码(JJWT)
EN

Stack Overflow用户
提问于 2017-03-28 09:19:55
回答 2查看 1.6K关注 0票数 3

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

问题是由于base64解码错误,JJWT库无法解析JSON头。

头Base64代码:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRva2VuLXNpZ25pbmcifQ

由JJWT解码(归结为调用:new String(javax.xml.bind.DatatypeConverter.parseBase64Binary(myBase64), java.nio.charset.Charset.forName("UTF-8")))):

代码语言:javascript
复制
{"alg":"RS256","typ":"JWT","kid":"token-signing"

所以最后的卷发支架丢了。

然而,当我尝试与其他解码器(https://www.base64decode.org/)ше-最后的卷曲大括号到位。

对于其他开发人员来说,同样的代码也可以工作。

在Java中影响Base64解码的可能是特定的环境吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-28 12:08:40

JWT的头和有效载荷是base64 url编码的,这与base64略有不同(用-_替换+\和删除尾随=)。

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

代码语言:javascript
复制
java.util.Base64.getUrlDecoder().decode(string);

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

代码语言:javascript
复制
String origValue = TextCodec.BASE64URL.decodeToString(base64UrlEncodedHeader);

也许你在使用其他图书馆?

票数 3
EN

Stack Overflow用户

发布于 2017-03-28 09:37:25

您收到的头是Base64 无输出填充 (请注意,有66个字符,它不是4的倍数)。指定了DatatypeConverter.parseBase64Binary来解析XML xsd:base64Binary类型,需要输出填充。显然,它将结尾处的非填充字符视为无效字符,并简单地忽略它们。

要么使用不同的解码器(Java 8有java.util.Base64Apache Commons.Codec有一个番石榴也有,或者自己填充输出)(如果删除所有非Base64 64字符后的字符串长度不能被4整除,pad有'=‘直到它是’=‘)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43065553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档