482 / 736CSPRNG

CSPRNG

Kryptograficznie bezpieczny generator liczb pseudolosowych

Gdy portfel potrzebuje nowego sekretu, nie wystarczy liczba, która tylko wygląda losowo. CSPRNG ma sprawić, by kolejnych wartości nie dało się praktycznie przewidzieć, nawet gdy atakujący pozna część wyników.

CSPRNG to kryptograficznie bezpieczny generator liczb pseudolosowych. Oblicza kolejne wartości z tajnego stanu wewnętrznego według określonej procedury. „Pseudolosowy” nie znaczy gorszy: obliczenie jest powtarzalne, ale bez znajomości tajnego stanu wyniki powinny być praktycznie nieprzewidywalne. Potrzebna jest do tego wystarczająca entropia, czyli niepewność dotycząca danych wejściowych z perspektywy atakującego, oraz poprawne użycie generatora w aplikacji.

Wyobraź sobie program tworzący tajne wartości dla portfela. Atakujący poznaje niektóre wcześniejsze wyniki. Bezpieczny generator nie może pozwolić, by ta wiedza ułatwiła odgadnięcie pozostałych. To trudniejsze wymaganie niż ładny rozkład liczb na wykresie. RFC 4086 odróżnia więc ciągi silne kryptograficznie od zwykłych generatorów do symulacji. Nawet dobry wynik testu statystycznego nie wystarczy, jeśli można odgadnąć seed, czyli wartość początkową generatora. [1]

W dokumentacji technicznej występuje też DRBG, deterministyczny generator losowych bitów. „Deterministyczny” oznacza, że ten sam stan i te same dane wejściowe dają taki sam wynik. Stan musi więc pozostać tajny. NIST SP 800-90A Rev. 1 opisuje konkretne mechanizmy: Hash_DRBG, HMAC_DRBG i CTR_DRBG. Są to procedury techniczne, a nie znak jakości każdego programu, który wymienia ich nazwy. Trzeba sprawdzić również ustawienia, pochodzenie entropii i faktyczną implementację w kodzie. [2]

Wyciek stanu rodzi dwa odrębne pytania. Czy atakujący potrafi odtworzyć wcześniejsze tajne wyniki? Czy może przewidzieć następne? Ochrona dawnych wyników to Backtracking resistance, a przyszłych — Prediction resistance. W tym drugim przypadku NIST SP 800-90A wymaga skutecznego dodania świeżej entropii, która oddzieli nowe wyniki od ujawnionego stanu. Samo ponowienie obliczenia nie musi przywrócić bezpieczeństwa. Obecność jednej ochrony nie dowodzi też automatycznie drugiej. [2]

Biblioteka to gotowy komponent oprogramowania, z którego może korzystać portfel. Jej wywołanie może jednak zakończyć się błędem. W OpenSSL 3.5 funkcje RAND_bytes() i RAND_priv_bytes() zwracają 1 przy powodzeniu, 0 przy innym błędzie i -1, gdy bieżąca metoda nie jest obsługiwana. Awaria źródła entropii może spowodować odmowę generowania. Program musi sprawdzić wynik wywołania przed użyciem zarezerwowanego obszaru pamięci, czyli bufora. Inaczej może wykorzystać dane, które nigdy nie zostały bezpiecznie wygenerowane. [3]

Powtarzalność przydaje się w testach: programista chce porównać wynik z oczekiwanym. Dlatego funkcja randombytes_buf_deterministic() w libsodium tworzy ten sam ciąg z tego samego seedu. Podczas zwykłego działania niezamierzone powtórzenie jest jednak problemem. Migawka maszyny wirtualnej zapisuje stan komputera wraz z pamięcią. Jej przywrócenie może więc powtórzyć również stan i wyniki generatora. Kopie środowiska nie muszą tworzyć niezależnych sekretów. [4]

Generator może dostarczyć dobre dane losowe, które aplikacja następnie błędnie przetworzy. Sprowadzenie ich do mniejszego dozwolonego zakresu przez zwykłą resztę z dzielenia może sprawić, że pewne wyniki będą częstsze niż inne. Funkcja randombytes_uniform() w libsodium zapobiega temu, wybierając równomiernie poniżej określonej górnej granicy. Klucze muszą ponadto spełniać reguły swojego algorytmu. Bezpieczeństwo nie kończy się zatem na uzyskaniu losowych bajtów: liczy się także to, co dzieje się z nimi dalej. [4]

Nonce to wartość przeznaczona do pojedynczego użycia w procedurze kryptograficznej. Reguły jej stosowania określa jednak protokół. RFC 8439 wymaga, aby nonce nie powtarzał się z tym samym kluczem; losowy wygląd nie gwarantuje unikalności. RFC 6979 opisuje natomiast deterministyczne obliczanie wartości k potrzebnej do podpisu cyfrowego z tajnego klucza i podpisywanej wiadomości. To różne konstrukcje, nie sprzeczność. Polecenie „wszędzie dodaj losowość” nie zastępuje poprawnej procedury. [5] [6]

Sam napis CSPRNG nie mówi, czy portfel poprawnie wykorzystuje cały system. Kontrola techniczna obejmuje konkretną wersję biblioteki, uruchomienie generatora, obsługę błędów i zachowanie po przywróceniu lub skopiowaniu stanu. Dokumentacja OpenSSL i libsodium opisuje właściwości ich funkcji, nie bezpieczeństwo każdej korzystającej z nich aplikacji. Dla użytkownika ważny jest też dalszy ciąg: doskonale wygenerowany sekret przestaje chronić środki, jeśli później wycieknie kopia zapasowa pozwalająca odzyskać dostęp. [3] [4]

Pełniejszy obraz uzyskasz, czytając to hasło razem z Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. Do tego hasła prowadzą również odsyłacze z Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.

DOC · 001RFC 4086 — Cryptographically strong sequencesSpecyfikacja DOC · 002NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistanceSpecyfikacja DOC · 003OpenSSL 3.5 — RAND_bytes return values and errorsDokumentacja DOC · 004libsodium — Random data and deterministic testingDokumentacja DOC · 005RFC 8439 — Nonce uniquenessSpecyfikacja DOC · 006RFC 6979 — Deterministic signingSpecyfikacja
Zaktualizowano: Najpierw źródła · To nie jest porada inwestycyjna