Base64编码的有效字符范围

75

我对以下内容感兴趣:
是否有一份字符列表,这些字符 永远不会 出现在 base64 编码的字符串中?
例如 *。 我不确定这种情况是否会发生。 如果原始输入实际上包含 *,那么它会被编码成不同的方式吗?


3
我可以进行翻译。这是需要翻译的内容:我会查看这个页面来解决它。http://en.wikipedia.org/wiki/Base64 - Peter Lawrey
2
认为输入中的 * 会在输出中表示为 * 是荒谬的,并表明对输入与输出之间关系的概念混乱严重。只有当 * 是基本64个字符集的成员时,它才可能出现在输出中...无论输入中是什么。 - Jim Balter
4个回答

134
这是我找到的信息: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

因此,匹配Base64编码中任何永远不应该出现的字符的正则表达式应为:
[^A-Za-z0-9+/=]

然而,正如kapeps的回答所指出的那样,这只是建议。具体实现可能会选择不同的64个字符集。(事实上,即使链接的RFC也包含了一张用于URL和文件名安全编码的替代表,它将字符62和63分别替换为-_)。因此,我想这真的取决于创建编码的具体实现。


4
“/”作为标准的一部分,意味着它不能用于文件命名。另外,为什么不从0开始而是从A开始?为什么要故意让基数系统中的前十个数字与其他数字有所不同? - Aaron Franke
1
我无法回答你的第二个问题,但RFC提供了一种替代编码,它不使用“/”和“+”,并且专门设计用于文件名和URL的安全性。 - Martin Ender
3
顺便说一下,更合适的正则表达式应该是 ^[A-Za-z0-9+/]+={0,2}$ - Victor
有没有Python函数可以返回编码的值?例如,类似于base64('A') = 0,base64('O') = 14这样的东西。 - Praveen Parihar
@Praveen,不会的,因为在base64中,3个8位ASCII字符会变成4个6位base64字符(总共24位)。任何字符的编码都取决于原始字符串中它之前或之后的字符。 - Foo Bar
为什么是A-Z,a-z,0-9,+/?而不是0-9,A-Z,a-z,+/? - user14628718

25

Base64只包含A-Za-z0-9+/=。因此,不能使用的字符列表是:除上述字符外的所有可能字符。

对于特殊用途,也可以使用._


1
在标准的base64中是否包括=?看起来这会将字符总数增加到65个。您的信息来源是什么?编辑:看起来=用于填充,在数据在帧完成之前已经完整的情况下使用。 - Caleb Hensley
我从来没有在Base64数据中见过点或下划线。你说的“特殊目的”是什么意思?我认为这绝对是错误的。 - undefined

25
在大多数情况下,您可能可以使用其他答案来确保安全,但根据Wikipedia article on Base64的说法,您不能依赖于明确的列表:

用于64个字符的基数所选字符集的特定选择因实现而异。

RFC 4648提到了其他字母表,例如"URL和文件名安全"Base 64 Alphabet,其中+/被替换为-_table of Base64 variants中有使用不同字符的变体表。请记住,有关行分隔符的实现特定规则可以在同一表中找到。一些实现(如Mime)甚至允许(并忽略)不在字母表中的字符。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接