基数为 64 编码的有效字符范围

2022-08-31 15:31:54

我对以下内容感兴趣:
是否有永远不会作为 base 64 编码字符串的一部分出现的字符列表?
例如。我不确定这是否会发生。如果原始输入实际上作为它的一部分,那会以不同的方式编码吗?**


答案 1

以下是我可以找到的内容:RFC 4648

它包括这个方便的表格:

                  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

因此,与任何不应出现在 Base 64 编码中的字符匹配的正则表达式将是:

[^A-Za-z0-9+/=]

但是,正如kapeps答案所指出的那样,这只是建议。特定实现可能会选择一组不同的 64 个字符。(实际上,即使链接的RFC也包含URL和文件名安全编码的替代表,该表分别将字符62和63替换为和)。所以我想这真的取决于创建编码的实现。-_


答案 2

在大多数情况下,您可能对其他答案是安全的,但是根据维基百科上关于Base64的文章,您不应该有一个可以依赖的明确列表:

为基本所需的 64 个字符选择的字符集的特定选择因实现而异。

RFC 4648 提到了其他字母表,例如“URL 和文件名安全”Base 64 字母表,其中 和 被替换为 和 。+/-_

有一个使用不同字符的 Base64 变体表。请记住,有关于行分隔符的特定于实现的规则,您可以在同一个表中找到这些规则。一些实现(如 Mime)甚至允许(并忽略)不在字母表中的字符。