java - Java 中的 Base64 解码方式不同 (JJWT)

标签 java jvm base64 jwt

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

问题在于,由于 Base64 解码错误,JJWT 库无法解析 JSON header 。

header 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 解码?

最佳答案

您收到的 header 是 Base64 without output padding (注意有66个字符,不是4的倍数)。 DatatypeConverter.parseBase64Binary指定解析 XML 架构 xsd:base64Binary 类型,其中 requires output padding 。显然,它将末尾的非填充字符视为无效并简单地忽略它们。

要么使用不同的解码器(Java 8 有 java.util.Base64Apache Commons.Codec has oneGuava has one too ),或者自己填充输出(如果删除所有非 Base64 字符后字符串的长度不能被 4 整除,则用'=' 直到它为止)。

关于java - Java 中的 Base64 解码方式不同 (JJWT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43065553/

相关文章:

java - 显示我的 pdf 报告的正确名称

java - 从内部访问局部变量 - Java

java - Heroku JVM 调优

php - 从 Objective-C 应用程序发送 base64 到 PHP 服务器

java - AutoCompleteTextView 下拉样式与 Spinner 下拉样式

java - iText pdfReader 未在 ColdFusion 2018 中发布文件

java - 是否可以在java中将 secret 存储在堆栈上?

java - 转储文件中的特殊 java 线程

c# - Base64 在 C# 中编码 PDF?

image - 替代 unescape() 并将图像保存为 base64