【问题标题】:Range of valid character for a base 64 encodingbase 64 编码的有效字符范围
【发布时间】:2012-10-23 02:33:57
【问题描述】:

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

【问题讨论】:

  • 我会看看这个页面来解决它。 en.wikipedia.org/wiki/Base64
  • 输入中的* 将在输出中表示为* 的想法很奇怪,表明输入与输出之间的关系存在严重的概念混淆。当且仅当 * 是 base 64 字符集的成员时,* 才会出现在输出中......无论输入中的内容是什么。

标签: java regex base64 apache-commons


【解决方案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–Za–z0–9+/=。 所以不使用的字符列表是:所有可能的字符减去上面提到的字符。

      对于特殊用途,._ 也是可能的。

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 2023-03-26
        • 2011-03-04
        • 2018-02-09
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 2010-12-07
        相关资源
        最近更新 更多