【发布时间】:2021-06-11 05:51:17
【问题描述】:
我在 JSON 网络令牌之类的东西中看到的 Base64 和 Base64url 之间有什么区别?
【问题讨论】:
我在 JSON 网络令牌之类的东西中看到的 Base64 和 Base64url 之间有什么区别?
【问题讨论】:
Base64 和 Base64url 都是以字符串形式编码二进制数据的方法。您可以阅读有关 base64 的理论here。 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)
下面我将引用标准中的定义。
4. Base 64 编码
下面对base 64的描述来源于3, [4], [5], 和 [6]。这种编码可以称为“base64”。
Base 64 编码旨在表示任意序列 八位位组的形式,允许同时使用大写和 小写字母,但不必是人类可读的。
使用了 65 个字符的 US-ASCII 子集,可以实现 6 位
每个可打印字符表示。 (额外的第 65 个字符,“=”, 用于表示特殊的处理功能。)编码过程将 24 位的输入位组表示为 输出 4 个编码字符的字符串。从左往右走 对,一个 24 位的输入组是由 3 个 8 位串接而成的 输入组。然后将这 24 位视为 4 连接 6 位组,每个组被翻译成单个字符 在 base 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 编码
带有 URL 和文件名安全字母表的 Base 64 编码具有 已在 [12] 中使用。
已建议使用“~”作为替代字母 第 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) =
【讨论】:
/ 之外,所有内容都是相同的。正确的? 2. 如果- 掩盖了+,那么当它掩盖+ 时,您如何区分- 本身和-?
- 是在掩盖 +。它只是用于表示 62 的不同 ASCII 符号。如果您想实际表示- 字符,那么它将被编码为LQ==。见this。
base64url 比 base64 更常见对我来说是有道理的。你知道这是不是真的吗?