46

我在 JSON Web 令牌之类的东西中看到的 Base64 和 Base64url 有什么区别?

4

1 回答 1

65

Base64 和 Base64url 都是以字符串形式编码二进制数据的方法。您可以在此处阅读有关 base64 的理论。Base64 的问题在于它包含字符+/=,这些字符在某些文件系统名称和 URL 中具有保留的含义。所以 base64url 通过用+-替换/来解决这个问题_=不需要时可以消除尾随填充字符,但在 URL 中,它很可能是%URL 编码的。然后编码数据可以毫无问题地包含在 URL 中。

以下是差异图表:

Index  Base64  Base64Url

0      A       A 
1      B       B 
2      C       C 
3      D       D 
4      E       E 
5      F       F 
6      G       G 
7      H       H 
8      I       I 
9      J       J 
10     K       K 
11     L       L 
12     M       M 
13     N       N 
14     O       O 
15     P       P 
16     Q       Q 
17     R       R 
18     S       S 
19     T       T 
20     U       U 
21     V       V 
22     W       W 
23     X       X 
24     Y       Y 
25     Z       Z 
26     a       a 
27     b       b 
28     c       c 
29     d       d 
30     e       e 
31     f       f 
32     g       g 
33     h       h 
34     i       i 
35     j       j 
36     k       k 
37     l       l 
38     m       m 
39     n       n 
40     o       o 
41     p       p 
42     q       q 
43     r       r 
44     s       s 
45     t       t 
46     u       u 
47     v       v 
48     w       w
49     x       x
50     y       y
51     z       z
52     0       0
53     1       1
54     2       2
55     3       3
56     4       4
57     5       5
58     6       6
59     7       7
60     8       8
61     9       9
62     +       -
63     /       _
       
       =       (optional)

下面我将引用标准中的定义。

RCF 4648 规格

4. Base 64 编码

下面对基数 64 的描述源自3、[4]、[5] 和 [6]。这种编码可以称为“base64”。

Base 64 编码旨在以允许使用大写和小写字母但不需要人类可读的形式表示任意八位位组序列。


使用 65 个字符的 US-ASCII 子集,每个可打印字符可以表示 6 位。(额外的第 65 个字符“=”用于表示特殊处理功能。)

编码过程将 24 位输入位组表示为 4 个编码字符的输出字符串。从左到右,一个 24 位输入组是由 3 个 8 位输入组串联而成的。然后将这 24 位视为 4 个连接的 6 位组,每个组都被翻译成基 64 字母表中的单个字符。

每个 6 位组用作 64 个可打印字符数组的索引。索引引用的字符被放置在
输出字符串中。

                  Table 1: The Base 64 Alphabet

 Value Encoding  Value Encoding  Value Encoding  Value Encoding
     0 A            17 R            34 i            51 z
     1 B            18 S            35 j            52 0
     2 C            19 T            36 k            53 1
     3 D            20 U            37 l            54 2
     4 E            21 V            38 m            55 3
     5 F            22 W            39 n            56 4
     6 G            23 X            40 o            57 5
     7 H            24 Y            41 p            58 6
     8 I            25 Z            42 q            59 7
     9 J            26 a            43 r            60 8
    10 K            27 b            44 s            61 9
    11 L            28 c            45 t            62 +
    12 M            29 d            46 u            63 /
    13 N            30 e            47 v
    14 O            31 f            48 w         (pad) =
    15 P            32 g            49 x
    16 Q            33 h            50 y

如果在被编码的数据末尾可用的位少于 24 位,则执行特殊处理。一个完整的编码量
总是在一个量的末尾完成。
当输入组中可用的输入位少于 24 个时,将添加值为 0 的位
(在右侧)以形成整数个 6 位组。
使用“=”字符执行数据末尾的填充。由于
所有 base 64 输入都是整数个八位位组,因此只会出现以下情况:

(1)编码输入的最终量子是24位的整数倍;在这里,编码输出的最终单元将是 4 个字符的整数倍,没有“=”填充。

(2) 编码输入的最终量子正好是 8 位;在这里,编码输出的最终单元将是两个字符,后跟两个“=”填充字符。

(3) 编码输入的最终量子正好是 16 位;在这里,编码输出的最终单元将是三个字符,后跟一个“=”填充字符。

5. 使用 URL 和文件名安全字母的 Base 64 编码

在 [12] 中使用了带有 URL 和文件名安全字母的 Base 64 编码。

已建议使用“~”作为第 63 个字符的替代字母表。由于“~”字符在某些文件系统环境中具有特殊含义,因此推荐使用本节介绍的编码。剩余的未保留 URI 字符是“.”,但某些文件系统环境不允许多个“.”。在文件名中,从而使“。” 性格也不好看。

填充字符“=”在 URI [9] 中使用时通常采用百分比编码,但如果隐式知道数据长度,则可以
通过跳过填充来避免这种情况;见第 3.2 节。

这种编码可以称为“base64url”。这种编码
不应被视为与“base64”编码相同,
不应仅称为“base64”。除非另有说明
,否则“base64”指的是上一节中的 base 64。

此编码在技术上与前一个相同,除了第 62:nd 和 63:rd 字母字符,如表 2 所示。

     Table 2: The "URL and Filename safe" Base 64 Alphabet

 Value Encoding  Value Encoding  Value Encoding  Value Encoding
     0 A            17 R            34 i            51 z
     1 B            18 S            35 j            52 0
     2 C            19 T            36 k            53 1
     3 D            20 U            37 l            54 2
     4 E            21 V            38 m            55 3
     5 F            22 W            39 n            56 4
     6 G            23 X            40 o            57 5
     7 H            24 Y            41 p            58 6
     8 I            25 Z            42 q            59 7
     9 J            26 a            43 r            60 8
    10 K            27 b            44 s            61 9
    11 L            28 c            45 t            62 - (minus)
    12 M            29 d            46 u            63 _
    13 N            30 e            47 v           (underline)
    14 O            31 f            48 w
    15 P            32 g            49 x
    16 Q            33 h            50 y         (pad) =
于 2019-03-28T02:14:57.137 回答