2009-09-11 9 views
6

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?

Odpowiedz

9

Nie wydaje się być standardem, to RFC 3548 sekcja 4 bazowa 64 Kodowanie z URL i nazwa Bezpieczne Alfabetycznie:

To kodowanie jest technicznie identyczny do poprzedniej, z wyjątkiem 62: nd i 63: alfabet rd charakter, jak wskazano w tabeli 2.

+ i / należy zastąpić d odpowiednio przez - (minus) i _ (understrike). Jakiekolwiek niezgodne biblioteki powinny być opakowane tak są one zgodne z RFC 3548.

Zauważ, że wymaga to, że URL zakodować (pad) = znaków, ale ja wolę, że w ciągu URL kodującego + i / znaki ze standardowego alfabetu base64.

0

Dlaczego nie spróbować owijać go w urlencode()? Dokumentacja here.

+1

Który używa niepotrzebnej liczby znaków. Dlaczego po prostu nie narnij kodu binarnego w pierwszej kolejności? – recursive

2

Proponuję uruchomić wyjście z base64_encode przez urlencode. Na przykład:

function base64_encode_url($str) 
{ 
    return urlencode(base64_encode($str)); 
} 
1

Jeśli pytasz o prawidłowy sposób, użyłbym właściwego kodowania URL, a nie arbitralnej zamiany znaków. Najpierw zakodowuj dane za pomocą base64, a następnie zakoduj znaki specjalne, takie jak "=", z właściwym kodowaniem URL (np. %<code>).

+0

Nie używam już dostępnych funkcji, ale użycie funkcji urlencode() może znacznie wydłużyć czas. –

8

Nie sądzę, że jest coś dobrego czy nie.Jednak najpopularniejszym kodowaniem jest

Jest to powszechnie używane przez Google, Yahoo (nazywają to Y64). Najbardziej bezpieczna wersja enkoderów, których użyłem w Javie, Ruby obsługuje ten zestaw znaków.

+0

+1 za wzmiankę o Y64 i dodanie kultury do pytania – jmserra