2012-07-11 12 views
12

Idealnie chciałbym mieć coś w rodzaju example.com/resources/äFg4вNгё5, minimalnej liczby widocznych znaków, nieważne, że muszą być zakodowane procentowo przed przesłaniem ich przez HTTP.Adresy URL bezpieczne identyfikatory UUID w najmniejszej liczbie znaków

Czy możesz powiedzieć schemat, który efektywnie koduje UUID 128b w najmniejszą liczbę widocznych znaków, bez wyników zawierających znaki, które łamią adresy URL?

+2

Znaki międzynarodowe to wciąż trochę puszki z robakami; może działać zawsze w przeglądarce, ale jeśli wklejasz kopie w różnych aplikacjach, takich jak klient poczty, komunikator internetowy lub najzwyczajniejszy przypadek, SMS-y, ulegną uszkodzeniu. Base64, jak sugerują odpowiedzi, jest nadal najlepszym rozwiązaniem, chyba że podejmiesz niebezpieczne założenie, że użytkownicy nie będą używać tych linków poza tą samą przeglądarką. – Ekevoo

Odpowiedz

15

Base-64 jest do tego odpowiedni.

{098ef7bc-a96c-43a9-927a-912fc7471ba2} 

może być zakodowany jako

vPeOCWypqUOSepEvx0cbog 

Zwykłe równych znaki na końcu można porzucić, gdyż zawsze ciąg długości wielokrotnością 4. A zamiast + i /, możesz użyć bezpiecznych znaków. Można wybrać dwa z: -._~

Więcej informacji:

4

Używam łańcucha base64 bezpiecznego dla adresu URL. Poniżej przedstawiono kod w języku Python, który wykonuje to: *.

Ostatni wiersz usuwa znak "=" lub "==", który oznacza, że ​​kodowanie w podstawie podstawowej 64 powoduje umieszczanie znaków w adresie URL trudniejszym i jest niezbędny tylko do dekodowania informacji, które nie trzeba tutaj robić.

import base64 
import uuid 

# get a UUID - URL safe, Base64 
def get_a_Uuid(): 
    r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes) 
    return r_uuid.replace('=', '') 

* Ten robi przestrzegać norm: base64.urlsafe_b64encode następująco RFC 3548 i 4648 zobacz https://docs.python.org/2/library/base64.html. Usuwanie kodu == z danych kodowanych base64 o znanej długości jest dozwolone, patrz RFC 4648 §3.2. Identyfikator UUID/GUID jest określony w RFC 4122; §4.1 Format stwierdza "Format UUID to 16 oktetów". Propozycja base64 koduje te 16 oktetów.

+2

Nie działa z python3, powinieneś użyć zamiast tego: 'return base64.urlsafe_b64encode (uuid.uuid4(). Bytes) .strip (" = ")' (działa również w Pythonie 2, zwraca ciąg znaków Unicode). –