【发布时间】: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 安全的。