6

在查看 URL 安全 base 64 编码时,我发现它是一个非常不标准的东西。尽管 PHP 具有大量内置函数,但没有一个用于 URL 安全 base 64 编码的函数。在 的手册页上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;
}

与上面的 PHP 函数不同,这个 Perl 版本完全删除了 '='(等于)字符,而不是像 PHP 那样用 ','(逗号)替换它。Equals 是一个填充字符,因此 Perl 模块会在解码时根据需要替换它们,但是这种差异使两种实现不兼容。

最后,Python 函数urlsafe_b64encode(s)保留了 '=' 填充,提示有人设置此函数以删除在'python base64 url​​ safe'的 Google 结果中显着显示的填充:

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))

这里的愿望是有一个可以包含在 URL 中的字符串而无需进一步编码,因此丢弃或翻译字符“+”、“/”和“=”。既然没有明确的标准,那么正确的方法是什么?

4

5 回答 5

9

似乎有一个标准,它是RFC 3548,第 4 节,Base 64 Encoding with URL and Filename Safe Alphabet

此编码在技术上与前一种相同,除了第 62:nd 和 63:rd 字母字符,如表 2 所示。

+/应分别替换- (minus)为和_ (understrike)。任何不兼容的库都应该被包装,以便它们符合 RFC 3548。

请注意,这要求您对(pad) =字符进行 URL 编码,但我更喜欢 URL对标准 base64 字母表中的+和字符进行编码。/

于 2009-09-11T18:02:03.197 回答
8

我不认为有对或错。但最流行的编码是

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

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

于 2009-09-11T19:30:31.670 回答
2

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

function base64_encode_url( $str )
{
    return urlencode( base64_encode( $str ) );
}
于 2009-09-11T17:59:06.027 回答
1

如果您询问正确的方法,我会使用正确的 URL 编码,而不是任意替换字符。首先对您的数据进行base64 编码,然后使用适当的URL 编码(即)进一步编码特殊字符,例如“=” %<code>

于 2009-09-11T18:01:29.547 回答
0

你为什么不尝试将它包装在一个urlencode()? 文档在这里。

于 2009-09-11T17:58:34.293 回答