【问题标题】:Base64 decoded differently in Java (JJWT)Java (JJWT) 中的 Base64 解码方式不同
【发布时间】:2017-03-29 02:27:39
【问题描述】:

我有一个由某些服务生成的 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 解码?

【问题讨论】:

    标签: java jvm base64 jwt


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      JWT 的标头和有效负载是 base64 url​​ 编码,这与 base64 略有不同(将 +、\ 替换为 -、_ 并删除尾随 @987654326 @)

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

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

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

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

      您可能正在使用其他库吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 2010-10-02
        相关资源
        最近更新 更多