【问题标题】:String based data encoding: Base64 vs Base64url基于字符串的数据编码:Base64 vs Base64url
【发布时间】:2021-06-11 05:51:17
【问题描述】:

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

【问题讨论】:

    标签: url base64 base64url


    【解决方案1】:

    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)
    

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

    RCF 4648 specs

    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) =
    

    【讨论】:

    • 我可能在这里遗漏了一些东西。但是 1. 关于“这里是差异图表”+ 和 / 之外,所有内容都是相同的。正确的? 2. 如果- 掩盖了+,那么当它掩盖+ 时,您如何区分- 本身和-
    • @Honey,一:没错,Base64 和 Base64url 仅在位置 62 和 63 不同。二:我不会真的说 - 是在掩盖 +。它只是用于表示 62 的不同 ASCII 符号。如果您想实际表示- 字符,那么它将被编码为LQ==。见this
    • @Suragch - 就该领域最常见的情况而言,base64urlbase64 更常见对我来说是有道理的。你知道这是不是真的吗?
    • @ZephaniahGrunschlag,这对我来说也是正确的,但我不是这方面的专家。
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 2012-11-13
    • 2023-03-09
    • 2011-04-22
    相关资源
    最近更新 更多