正则表达式无效的Base64字符

时间:2013-09-06 15:28:59

标签: regex

如何创建match all invalid Base64个字符的正则表达式? 我在堆栈[^a-zA-Z0-9+/=\n\r].*$上找到了,但是当我尝试时,我得到了带有-符号的结果字符串。 我根本不知道正则表达式,任何人都可以验证这是好还是坏的正则表达式?

2 个答案:

答案 0 :(得分:8)

对您的问题的简短回答是,如果邮件包含来自类[^A-Za-z0-9+/=\s]的字符的任何匹配,那么它包含无效的base-64字符,除了可以自由混合其他数据的MIME邮件(用于各种用途)与base-64流一起使用。 (在解码base-64对象之前删除这些其他字符。)

作为一个有幸帮助编写一个非常快速的基本64位编码程序内部的人,用每个机器指令处理多字节块,让我补充几点:

  • base-64字母表为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
  • 输出必须根据需要填充零个或多个=符号,以便非空白字符的总长度为4的倍数。
  • 那些等号只能出现在base-64消息的末尾,并且最多可以有两个消息。
  • 无论使用何种类型,都应忽略空格。通常消息被包装到一定的边距(必须是四的倍数),但这不是必需的。 base 64编码的目的是将任意值(尤其是二进制数据)作为纯文本传输。理论上,你甚至可以使用base 64编码通过手机读取某人的JPEG图像。

因此,我建议验证base-64消息不仅仅是使用正则表达式。取而代之的是,

  1. 消除所有空格并调用结果输出z的长度。
  2. 计算基数为64的字母字符的数量x
  3. 计算邮件末尾的等号y
  4. 如果y最多为2且x + y = z,则返回有效,否则无效。

    • 注1:填充字符===不起任何保护数据完整性的目的,并且有许多base-64编码的衍生产品不使用它们。许多人认为填充几乎与CRLF行结束序列的CR部分一样无用且浪费处理时间。
    • 注意2:用于MIME编码的变体接受base-64字母表之外的字符包含在消息流中,但在解码base-64数据对象时只是丢弃它们。
    • 注3:我不喜欢现代术语“Base64”,因为它是一个非常丑陋的词。这个假词从未被原作为64位作家使用,但在未来9年的某个时候被采用。
  5. 您可以将大部分内容编码为正则表达式,如下所示(不对最后一个base-64数据块进行精确的长度检查):

    ^\s*(?:(?:[A-Za-z0-9+/]{4})+\s*)*[A-Za-z0-9+/]*={0,2}\s*$
    

    enter image description here

答案 1 :(得分:2)

应该是^[a-zA-Z0-9+/\r\n]+={0,2}$ 1

目前它只匹配一个有效字符,然后允许后面的任何内容。所以,例如:

aGVsbG8sIHdvcmxkIQ==     match
aGV%sb-G8sIHdvcmxkIQ==   also a match (starts with "a")

最后删除.*,并在类中添加量词,它会强制整个字符串合法:

aGVsbG8sIHdvcmxkIQ==     match
aGV%sb-G8sIHdvcmxkIQ==   not a match

1 正如@pswg指出的那样,有效的base64不应该在值中包含= (因为=具有特殊含义,用作填料。