base 64 编码的有效字符范围
Posted
技术标签:
【中文标题】base 64 编码的有效字符范围【英文标题】:Range of valid character for a base 64 encoding 【发布时间】:2012-10-23 02:33:57 【问题描述】:我对以下内容感兴趣:
是否存在一个从不作为 base 64 编码字符串的一部分出现的字符列表?
例如*
。我不确定这是否会发生。如果原始输入实际上有 *
作为它的一部分,它的编码方式会有所不同吗?
【问题讨论】:
我会看看这个页面来解决它。 en.wikipedia.org/wiki/Base64 输入中的*
将在输出中表示为*
的想法很奇怪,表明输入与输出之间的关系存在严重的概念混淆。当且仅当 *
是 base 64 字符集的成员时,*
才会出现在输出中......无论输入中的内容是什么。
【参考方案1】:
在大多数情况下,您可能对其他答案是安全的,但根据Wikipedia article on Base64,您不应该有一个可以依赖的明确列表:
为基础所需的 64 个字符选择的字符集的特定选择因实现而异。
RFC 4648 提到了其他字母,例如“URL 和文件名安全”Base 64 Alphabet,其中+
和/
被替换为-
和_
。
有一个table of Base64 variants 使用不同的字符。 请记住,有关于行分隔符的实现特定规则,您可以在同一张表中找到这些规则。像Mime 这样的一些实现甚至允许(并忽略)不在字母表中的字符。
【讨论】:
【参考方案2】:这是我可以找到的: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 分别替换为 -
和 _
)。所以我想这真的取决于创建编码的实现。
【讨论】:
/
是标准的一部分意味着它不能用于命名文件。另外,为什么不在A
之前以0
开头呢?为什么要故意使基本系统中的前十个数字不同?
我无法回答您的第二个问题,但 RFC 确实提供了不使用 /
和 +
的替代编码,并且专门设计用于文件名和 URL 的安全。
@MartinEnder 顺便说一句,更合适的正则表达式是^[A-Za-z0-9+/]+=0,2$
。
有没有可以返回编码值的python函数?例如,像 base64('A') = 0, base64('O') = 14【参考方案3】:
https://en.wikipedia.org/wiki/Base64#Design
MIME 的 Base64 实现使用 A–Z、a–z 和 0–9 作为前 62 个值
因此,在大多数情况下,您应该只期待字母数字字符。本文中的示例表还显示了“+”和“-”;您不太可能会看到“*”。
例如,您可以使用http://www.motobit.com/util/base64-decoder-encoder.asp 转换为 Base64,对于 '*' 这将返回 "Kg=="
【讨论】:
【参考方案4】:Base64 仅包含 A–Z
、a–z
、0–9
、+
、/
和 =
。
所以不使用的字符列表是:所有可能的字符减去上面提到的字符。
对于特殊用途,.
和 _
也是可能的。
【讨论】:
以上是关于base 64 编码的有效字符范围的主要内容,如果未能解决你的问题,请参考以下文章
无法在'Window'上执行'btoa':要编码的字符串包含Latin1范围之外的字符。
网络安全——Base64编码MD5SHA1-SHA512HMAC(SHA1-SHA512)哈希