Zestawy znaków dla losowych ciągów znaków
Zestaw znaków, który wybierasz dla losowych ciągów znaków, wpływa na entropię, kompatybilność i użyteczność. Ten przewodnik pomoże Ci wybrać odpowiednie zestawy znaków dla różnych przypadków użycia.
Standardowe zestawy znaków
Małe litery (a-z) oferują 26 znaków i 4,7 bita entropii na znak. To najbardziej czytelny i kompatybilny zestaw znaków, działa w systemach niewrażliwych na wielkość liter i jest łatwy do komunikowania ustnie. Wymaga jednak dłuższych ciągów znaków, aby osiągnąć tę samą entropię co alternatywy z mieszaną wielkością liter.
Wielkie litery (A-Z) mają identyczne właściwości jak małe litery - 26 znaków i 4,7 bita na znak. Kombinacja małych i wielkich liter daje 52 znaki i 5,7 bita na znak, co zwiększa bezpieczeństwo bez dodawania znaków specjalnych, które mogłyby powodować problemy z kompatybilnością.
Cyfry (0-9) dodają 10 znaków. Kombinacje alfanumeryczne (a-z, A-Z, 0-9) oferują 62 znaki i 5,95 bita na znak. Jest to szeroko kompatybilne i działa w większości kontekstów: URL-ach, bazach danych, nazwach plików i identyfikatorach programistycznych.
Znaki specjalne (!@#$%^&*()_+-=[]{}|;:,.<>?) maksymalizują entropię z 6,55 bita na znak w połączeniu z alfanumerycznymi (łącznie 94 drukowalne znaki ASCII). Jednak wprowadzają wyzwania kompatybilności i mogą wymagać escapowania w URL-ach, powłokach czy bazach danych.
Relacja między rozmiarem zestawu znaków a entropią jest logarytmiczna: entropia na znak = log2(rozmiar zestawu znaków). Podwojenie rozmiaru zestawu znaków nie podwaja entropii - dodaje jeden bit na znak. Przejście z 62 do 94 znaków zwiększa entropię tylko o około 0,6 bita na znak.
Zestawy znaków bezpieczne dla URL
Ciągi znaków bezpieczne dla URL unikają znaków o specjalnych znaczeniach w URL-ach. Niezarezerwowane znaki w URL-ach to: A-Z, a-z, 0-9, myślnik (-), kropka (.), podkreślenie (_) i tylda (~). Te 66 znaków nigdy nie wymaga kodowania URL.
Base64URL to standardowe kodowanie bezpieczne dla URL, które używa A-Z, a-z, 0-9, myślnika (-) i podkreślenia (_) - łącznie 64 znaki. Zastępuje plus (+) i ukośnik (/) ze standardowego Base64, które mają specjalne znaczenia w URL. To de facto standard dla bezpiecznych dla URL losowych ciągów znaków.
Parametry zapytania mają dodatkowe rozważania. Chociaż możesz kodować w URL dowolne znaki, unikanie potrzeby kodowania upraszcza kod i czyni URL-e bardziej czytelnymi. Trzymaj się alfanumerycznych plus myślnik i podkreślenie dla wartości parametrów zapytania używanych jako tokeny.
Fragmenty (część po #) mają nieco inne reguły, ale generalnie korzystają z tych samych ograniczeń zestawu znaków. Niektóre frameworki parsują zawartość fragmentów, więc znaki bezpieczne dla URL zapobiegają nieoczekiwanemu zachowaniu.
Segmenty ścieżki korzystają z restrykcyjnych zestawów znaków. Chociaż wiele znaków specjalnych jest technicznie prawidłowych w ścieżkach URL po zakodowaniu, używanie tylko znaków alfanumerycznych plus myślnik sprawia, że ścieżki są czystsze i bardziej kompatybilne z różnymi serwerami webowymi i proxy.
Wykluczanie niejednoznacznych znaków
Niejednoznaczne znaki wyglądają podobnie w wielu czcionkach i powodują zamieszanie, gdy ludzie czytają lub wpisują ciągi znaków. Najbardziej problematyczne to: 0 (zero) i O (wielka litera o), 1 (jeden), l (mała litera L) i I (wielka litera i).
Kiedy wykluczać niejednoznaczne znaki zależy od interakcji ludzkiej. Jeśli użytkownicy nigdy nie widzą ciągów znaków (czysto wewnętrzne tokeny), włącz wszystkie znaki dla maksymalnej entropii. Jeśli użytkownicy muszą czytać ciągi znaków (wyświetlanie kodów potwierdzenia), wyklucz niejednoznaczne znaki dla jasności. Jeśli użytkownicy muszą wpisywać ciągi znaków (wprowadzanie kodów zapasowych), zdecydowanie wyklucz niejednoznaczne znaki, aby zapobiec błędom.
Koszt entropii wykluczenia niejednoznacznych znaków jest niewielki. Usunięcie 0, O, 1, l, I z alfanumerycznych (62 znaki) pozostawia 57 znaków. To zmniejsza entropię z 5,95 do 5,83 bita na znak - tylko 0,12 bita na znak. 20-znakowy ciąg traci około 2,4 bita całkowitej entropii, łatwo rekompensowane dodaniem jednego dodatkowego znaku.
Dodatkowe wykluczenia mogą poprawić użyteczność. Niektórzy wykluczają 0 i O, ale zachowują 1, l, I, gdy kontekst czcionki jest jasny. Inni wykluczają Z i 2, które mogą wyglądać podobnie w niektórych czcionkach. Samogłoski mogą być wykluczone, aby zapobiec przypadkowemu generowaniu słów (które mogłyby być obraźliwe lub mylące). Kompromis to zawsze: jak bardzo wykluczenie poprawia użyteczność versus jak bardzo zmniejsza entropię?
Niestandardowe zestawy znaków dla specyficznych kontekstów rozwiązują problemy specyficzne dla domeny. Szesnastkowy (0-9, a-f) jest uniwersalnie rozumiany przez programistów i zapewnia czyste, jednoznaczne ciągi znaków. Sekwencje DNA używają A, C, G, T. Kod Morse'a używa kropek i kresek. Definiuj zestawy znaków w oparciu o swoje wymagania i obliczaj entropię, aby upewnić się, że ciągi znaków są wystarczająco długie dla ich celu.
Wypróbuj Narzędzie
Random String Generator
Powiązane Artykuły
Czym są losowe ciągi znaków?
Losowe ciągi znaków to sekwencje znaków wybierane nieprzewidywalnie z określonego zestawu. Są wszędzie w nowoczesnym oprogramowaniu - od ciasteczka sesji w Twojej przeglądarce po klucz API dla Twoich usług chmurowych. Zrozumienie losowych ciągów znaków pomaga Ci używać ich odpowiednio i bezpiecznie.
Bezpieczeństwo losowych ciągów znaków
Losowe ciągi znaków to krytyczne prymitywy bezpieczeństwa. Prawidłowo używane dostarczają nieprzewidywalnych tokenów, które chronią sesje użytkowników i uwierzytelniają dostęp do API. Nieprawidłowo używane tworzą podatności, które atakujący wykorzystują. Ten przewodnik obejmuje niezbędne praktyki bezpieczeństwa.