Patrząc na kodowanie w bezpiecznym base 64, odkryłem, że jest to bardzo niestandardowa rzecz. Pomimo dużej liczby wbudowanych funkcji, jakie posiada PHP, nie istnieje kodowanie Safe Encryption w wersji 64. Na stronie podręcznika dla base64_encode()
, większość komentarzy sugerujemy użycie tej funkcji, owinięty strtr()
:Jakie znaki należy zastąpić, aby kodowanie adresu URL w wersji podstawowej 64 było bezpieczne?
function base64_url_encode($input)
{
return strtr(base64_encode($input), '+/=', '-_,');
}
Jedyny moduł Perl udało mi się znaleźć w tym obszarze jest MIME::Base64::URLSafe (source), które wykonuje następującą wymianę wewnętrznie:
sub encode ($) {
my $data = encode_base64($_[0], '');
$data =~ tr|+/=|\-_|d;
return $data;
}
przeciwieństwie do funkcji PHP powyżej, ta wersja Perl spada znak „=” (równa) w całości, a nie zastąpienie go „” (przecinek) jak robi PHP. Equals to znak dopełniający, więc moduł Perl zastępuje je w razie potrzeby po dekodowaniu, ale ta różnica sprawia, że dwie implementacje są niekompatybilne.
Wreszcie, funkcja Python urlsafe_b64encode(s) utrzymuje „=” wyściółkę wokół, co skłoniło kogoś postawić this function usunąć wyściółkę, która pokazuje wyraźnie w wynikach Google dla '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))
Pragnienie Oto mieć ciąg znaków, który może być zawarty w adresie URL bez dalszego kodowania, a zatem zrzucanie lub tłumaczenie znaków "+", "/" i "=". Ponieważ nie ma zdefiniowanego standardu, jaka jest właściwa droga?
Który używa niepotrzebnej liczby znaków. Dlaczego po prostu nie narnij kodu binarnego w pierwszej kolejności? – recursive