【问题标题】:Ensure a base64 encoded string never includes a nonalphanumerical character确保 base64 编码的字符串从不包含非字母数字字符
【发布时间】:2012-05-20 20:31:49
【问题描述】:

是否有办法确保 base64 编码的字符串永远不会包含非字母数字字符?

例如,如果我有一个要编码的长字符串,是否可以在其前面添加或附加一些内容,以确保在使用 base64 编码时,编码字符串中仅包含字母和数字?像这样的:

字符串:192.168.1.1

编码:MTkyLjE2OC4xLjE=

我尝试在字符串末尾附加}(新字符串现在是192.168.1.1}),这很有效(新编码字符串:MTkyLjE2OC4xLjF9),但是有没有一种方法可以确保每个组合都有效?

这可能吗?

【问题讨论】:

    标签: base64


    【解决方案1】:

    您可以直接删除等号,这是大多数人所做的。

    但至于你的问题:当字符串的长度 / 3 是一个整数时。所以:

    $pad = strlen($str) % 3; if($pad) { $str .= str_repeat(' ', $pad); }
    

    但是,是的,当您将字符串传回时,解析器会自动将等号添加回 4 的倍数 - 所以您不需要保留它们。

    【讨论】:

    • 如果 $str = AAA $pad = 0 没问题,您的代码是错误的,但是 $str=AAAA $pad=1 所以它会重复空格一次,而它应该重复两次以避免等号, $str=AAAAA $pad=2 同样的问题会重复两次而不是一次。所以应该是 $pad = strlen($string)%3; if($pad == 1){ $string.= str_repeat('Q',2); }elseif($pad == 2){ $string.= str_repeat('Q',1); }else { $pad='0'; }
    【解决方案2】:

    关于长度。 = 符号是填充以使输出成为 4 个 base64 字符的倍数。 3 个字符转换为 4 个 base64 字符,因此您只需以某种方式使输入字符串的长度为 3 个字符的倍数。在你的情况下:

    192.168.1.1 - 11 characters long, base64 ends with =
    192.168.1.1$ - 12 characters long, base64 doesn't end with =
    

    选择一个您可以轻松删除的填充字符。

    另一种选择是从输出中删除 =,然后确保在尝试 base64 解码之前附加 = 符号以生成 4 个字符的倍数...

    【讨论】:

    • 有趣。因此,在返回字符串之前,我必须对字符串执行类似三元的操作(如果我使用函数来生成编码字符串),以确保它不会以非字母数字结尾。
    • 这是base64 定义的一部分。编码还使用了许多非字母数字字符,以便能够容纳 64 位(编码的字符串也可以包含 /+)。如果这是不可接受的,您应该寻找base64 的替代品,而不是破解它。 (有一个名为 base62 的规范可能更适合您。)另见 en.wikipedia.org/wiki/Base64
    猜你喜欢
    • 2017-07-05
    • 2012-01-05
    • 1970-01-01
    • 2014-01-07
    • 2021-06-03
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多