【问题标题】:Different Base64 decoders不同的 Base64 解码器
【发布时间】:2018-02-27 11:18:15
【问题描述】:

我在验证 JWT 时遇到了问题。我正在运行的代码是一个非常肮脏的 hack,它采用 JWT 的第二个组件并通过 Base64 解码器运行它。然而事实证明,使用一些超级特殊的 JWT,我得到了一些非法字符(5f)。

这是在使用Base64.getDecoder().decode(claims) 时 我读了一点,有点想我必须改用Base64.getUrlDecoder().decode(claims) 来让它工作(它似乎是这样做的)。

但我不完全明白为什么...我在Base64 的文档中找到了这个:

基本 使用 RFC 4648 和 RFC 2045 的表 1 中指定的“Base64 字母”进行编码和解码操作。编码器不添加任何换行符(行分隔符)。解码器拒绝包含 base64 字母表之外的字符的数据。

URL 和文件名安全 使用 RFC 4648 的表 2 中指定的“URL 和文件名安全 Base64 字母”进行编码和解码。编码器不添加任何换行符(行分隔符)。解码器拒绝包含 base64 字母表之外的字符的数据。

这里唯一的区别是 Basic 也使用 RFC 2045,但有人可以解释这是怎么回事吗?

【问题讨论】:

  • "Normal" Base64 可以包含 + 和 / 符号,如果在 URL 中使用它们会中断,因为它们在 URI 方案中具有重要意义(+ 可以解释为编码空间,/ 是路径分隔符) RFC 中的表 2 指定 - 和 _ 作为替换,因为它们是 URI 安全的。

标签: java base64 jwt decode


【解决方案1】:

此答案基于 Alex K 的评论。

RFC 2045 是 Base64 编码的原始 RFC。在使用此 RFC 时,很明显,此编码不适用于 URL/URI 编码,因为此 RFC 使用字符 + 和 /。

后来创建了一个修订的 RFC (RFC 4648),其中包含一个新表,其中包含可用于编码的字符。此表使用其他字符而不是 + 和 /。

因此,今天您必须使用这两个表之一进行 base64 编码。应尽可能使用第一个表,而仅当 + 和 / 的使用导致问题(例如 URL)时才应使用第二个表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 2020-01-24
    • 2018-09-13
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多