基于字符串的数据编码:Base64 vs Base64url

Sur*_*gch 35 url base64 base64url

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

Sur*_*gch 47

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)
Run Code Online (Sandbox Code Playgroud)

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

RCF 4648 规格

4. Base 64 编码

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

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

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

编码过程将 24 位输入位组表示为 4 个编码字符的输出字符串。从左到右,将 3 个 8 位输入组连接起来形成一个 24 位输入组。然后将这 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
Run Code Online (Sandbox Code Playgroud)

如果在被编码数据的末尾可用的位少于 24 位,则执行特殊处理。一个完整的编码量
总是在一个量的末尾完成。当
输入组中可用的输入位少于 24位时,值为零的位将被添加
(在右侧)以形成整数个 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”指的是上一节中的 base64。

这种编码在技术上与前一种编码相同,除了 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) =
Run Code Online (Sandbox Code Playgroud)

  • @Honey,一:这是正确的,Base64 和 Base64url 仅在位置 62 和 63 上不同。二:我真的不会说 `-` 掩盖了 `+`。它只是用于表示 62 的不同 ASCII 符号。如果您想实际表示“-”字符,那么它将被编码为“LQ==”。请参阅[此](https://www.base64encode.org/)。 (2认同)