应该执行哪些字符替换以使base 64编码URL安全?

Dre*_*ens 6 php url perl base64 encoding

在查看URL安全base 64编码时,我发现它是一个非常非标准的东西.尽管PHP拥有大量内置函数,但没有一个用于URL安全base 64编码.在手册页上base64_encode(),大多数评论建议使用该功能,包括strtr():

function base64_url_encode($input)
{
     return strtr(base64_encode($input), '+/=', '-_,');
}
Run Code Online (Sandbox Code Playgroud)

我在这个领域唯一可以找到的Perl模块是MIME :: Base64 :: URLSafe(source),它在内部执行以下替换:

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

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

最后,Python函数urlsafe_b64encode(s)保持'='填充,提示有人提出此函数来删除在Google搜索结果中显示为'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))
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*ner 9

似乎有一个标准,它是RFC 3548,第4节,基本64编码与URL和文件名安全字母:

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

+/应分别替换为- (minus)_ (understrike).应该包装任何不兼容的库,使它们符合RFC 3548.

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


ZZ *_*der 8

我认为没有对错.但最流行的编码是

'+/=' => '-_.'
Run Code Online (Sandbox Code Playgroud)

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