Java 不同的Base64解码器

Java 不同的Base64解码器,java,base64,jwt,decode,Java,Base64,Jwt,Decode,我在验证JWT时遇到了一个问题。我正在运行的代码是一个相当肮脏的黑客,它使用JWT的第二个组件并通过Base64解码器运行。然而,事实证明,使用一些超级特殊的JWT,我得到了一些非法字符(5f) 这是在使用Base64.getDecoder().decode(声明) 我读了一点东西,觉得我必须改用Base64.geturldecker().decode(声明)来让它工作(看起来是这样的) 但我不完全明白为什么。。。我在Base64的文档中找到了这个: 基本的 使用RFC 4648和RFC 204

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

这是在使用
Base64.getDecoder().decode(声明)
我读了一点东西,觉得我必须改用
Base64.geturldecker().decode(声明)
来让它工作(看起来是这样的)

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

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

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


这里唯一的区别是Basic也使用了
RFC 2045
,但是有人能解释一下这是怎么一个问题吗?

这个答案基于Alex K的评论

RFC 2045是Base64编码的原始RFC。使用此RFC时,经过一段时间后,很明显,此编码不适用于URL/URI编码,因为此RFC使用字符
+
/

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

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

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