代码之家  ›  专栏  ›  技术社区  ›  Drew Stephens

要使Base64编码URL安全,应该执行哪些字符替换?

  •  6
  • Drew Stephens  · 技术社区  · 15 年前

    在研究URL安全的Base64编码时,我发现这是一个非常不标准的东西。尽管PHP有大量的内置函数,但没有一个用于URL安全的Base64编码。在手册页上 base64_encode() ,大多数评论建议使用该函数,并用 strtr()

    function base64_url_encode($input)
    {
         return strtr(base64_encode($input), '+/=', '-_,');
    }
    

    在这方面我能找到的唯一Perl模块是 MIME::Base64::URLSafe source ),它在内部执行以下替换:

    sub encode ($) {
        my $data = encode_base64($_[0], '');
        $data =~ tr|+/=|\-_|d;
        return $data;
    }
    

    最后是Python函数 urlsafe_b64encode(s) 保持“=”的空白,提示某人张贴 this function 删除谷歌搜索结果中突出显示的填充 'python base64 url safe' :

    from base64 import urlsafe_b64encode, urlsafe_b64decode
    
    def uri_b64encode(s):
        return urlsafe_b64encode(s).strip('=')
    
    def uri_b64decode(s):
        return urlsafe_b64decode(s + '=' * (4 - len(s) % 4))
    

    正确的方法是什么?

    5 回复  |  直到 14 年前
        1
  •  9
  •   Grant Wagner    15 年前

    RFC 3548 ,第4条, :

    这种编码在技术上是相同的 到上一个,除了 62:nd和63:rd字母字符,如

    + / 应该由 - (minus) _ (understrike) 分别地应包装任何不兼容的库,使其符合RFC 3548。

    请注意,这需要对URL进行编码 (pad) = 字符,但我更喜欢它而不是URL编码 + /

        2
  •  8
  •   ZZ Coder    15 年前

    我认为没有对错之分。但最流行的编码是

    '+/=' => '-_.'
    

    谷歌、雅虎(他们称之为Y64)都广泛使用这种方法。Ruby是我在Java上使用的url最安全的编码器版本,它支持这个字符集。

        3
  •  2
  •   Jon Benedicto    15 年前

    我建议通过urlencode运行base64_encode的输出。例如:

    function base64_encode_url( $str )
    {
        return urlencode( base64_encode( $str ) );
    }
    
        4
  •  1
  •   Ates Goral    15 年前

    %<code>

        5
  •  0
  •   Fragsworth    15 年前

    你为什么不试着用塑料袋把它包起来呢 urlencode() ? 文档 here.