Poradnik bezpieczeństwa
Generowanie haseł po stronie klienta z użyciem Web Crypto i próbkowania z odrzucaniem
Dokument techniczny wyjaśniający model generowania haseł po stronie przeglądarki w PwdGen, granice entropii, próbkowanie z odrzucaniem oraz ograniczenia prywatności.
Streszczenie
PwdGen stosuje metodę generowania referencyjnego po stronie klienta: przeglądarka lub środowisko uruchomieniowe Web Crypto dostarcza losowe bajty, próbkowanie z odrzucaniem mapuje te bajty na nieobciążone indeksy w zadanym zakresie, a tasowanie Fisher-Yatesa rozdziela wymagane klasy znaków w końcowym haśle. Metoda jest celowo niewielka, poddająca się audytowi i powtarzalna w aplikacji webowej, adapterze API, CLI oraz przygotowanym pakiecie pwdgen-core.
Niniejszy dokument opisuje model inżynieryjny. Nie stanowi on twierdzenia o nowym prymitywie kryptograficznym, formalnym standardzie ani niezależnym audycie zewnętrznym.
Źródło losowości
Generator żąda kryptograficznie silnych wartości losowych poprzez crypto.getRandomValues(). Implementacje Web Crypto powinny używać kryptograficznie bezpiecznego generatora liczb pseudolosowych (CSPRNG) zasilanego wysokiej jakości entropią dostarczaną przez środowisko hosta. W praktyce przeglądarki delegują to zadanie do mechanizmów systemu operacyjnego i platformowych dostawców kryptograficznych.
PwdGen nie twierdzi, że każde wywołanie generowania hasła bezpośrednio próbkuje źródło szumu sprzętowego. Bezpieczniejszym i dokładniejszym stwierdzeniem jest, że przeglądarka dostarcza dane wyjściowe CSPRNG przez API Web Crypto, a PwdGen unika niekryptograficznych interfejsów pseudolosowych.
Dlaczego nie Math.random()
Math.random() nie jest przeznaczony do zastosowań wrażliwych na bezpieczeństwo. Nadaje się do symulacji, efektów wizualnych i zwykłego losowego zachowania interfejsu użytkownika, ale nie zapewnia gwarancji oczekiwanych dla haseł, kodów resetujących, kluczy podpisu ani innych poświadczeń.
PwdGen traktuje niebezpieczne pseudolosowe rozwiązania awaryjne jako stan błędu. Jeśli Web Crypto jest niedostępne, generator powinien wyświetlić błąd zgodności, a nie po cichu generować słabe poświadczenia.
Próbkowanie z odrzucaniem
Losowe bajty i liczby całkowite są zwykle pobierane z zakresu będącego potęgą dwójki. Alfabety haseł rzadko mają rozmiar, który dzieli ten zakres dokładnie. Bezpośrednia operacja modulo może sprawić, że niektóre znaki będą nieco bardziej prawdopodobne niż inne.
PwdGen stosuje próbkowanie z odrzucaniem:
- Pobierz 32-bitową liczbę całkowitą bez znaku.
- Oblicz największą wielokrotność rozmiaru alfabetu mieszczącą się w zakresie 32-bitowym.
- Odrzuć wartości powyżej tej granicy.
- Zastosuj modulo tylko do pozostałego pełnego zakresu.
Zapewnia to równomierny wybór znaków w ograniczonym zakresie bez wprowadzania mierzalnego obciążenia modulo.
Pokrycie znaków i entropia
Dla skonfigurowanych polityk haseł generator najpierw wybiera po jednym znaku z każdej włączonej klasy, wypełnia resztę z połączonego alfabetu, a następnie tasuje wynik. Pomaga to spełnić reguły docelowego hasła bez umieszczania przewidywalnej klasy w przewidywalnej pozycji.
Teoretyczne oszacowanie entropii wynosi:
bits = length × log2(uniqueAlphabetSize)
Ta wartość jest górną granicą dla jednolicie losowych wyborów z skonfigurowanego alfabetu. Nie uwzględnia ponownego użycia haseł, edytowanego przez użytkownika wyniku, naruszonych urządzeń, wyciekłych haseł ani słabego przechowywania przez docelową usługę.
Granica prywatności
W narzędziach przeglądarkowych wygenerowane wartości pozostają w pamięci strony i widocznych polach wyników, dopóki użytkownik ich nie skopiuje lub nie wyeksportuje. Lokalne generatory nie wysyłają wygenerowanych haseł do serwerów PwdGen, nie umieszczają ich w adresach URL ani nie zapisują w zdarzeniach analitycznych.
Ta granica nie chroni przed złośliwymi rozszerzeniami przeglądarki, menedżerami schowka, naruszeniem systemu operacyjnego, przechwytywaniem ekranu, stronami phishingowymi ani wklejeniem wygenerowanego hasła przez użytkownika w niebezpieczne miejsce.
Powtarzalna implementacja
Publiczny pakiet pwdgen-cli oraz przygotowany pakiet pwdgen-core istnieją po to, aby model generowania był możliwy do sprawdzenia poza stroną internetową. Testy jednostkowe obejmują włączanie klas znaków, wykluczone znaki, nieprawidłowe konfiguracje, wzory entropii oraz brak niebezpiecznych pseudolosowych ścieżek kodu awaryjnego.
Celem nie jest uczynienie PwdGen prywatnym standardem. Celem jest uczynienie implementacji na tyle małą, aby programiści mogli ją przeczytać, przetestować i zastąpić, gdy ich środowisko wymaga innej granicy zaufania.