Kryptograficznie bezpieczne PRNG
Poznać /dev/urandom, ChaCha20-CSPRNG i Fortunę
Kryptograficznie bezpieczne PRNG to bezpłatna lekcja Cryptology Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cryptology Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cryptology Academy zawiera 4 lekcji w sumie.
Podsumowanie wymagań CSPRNG
CSPRNG musi spełniać następujące wymagania: (1) nieprzewidywalność następnego bitu — znając wszystkie wcześniejsze bity, nie można przewidzieć następnego z prawdopodobieństwem > 1/2 + wartość pomijalna. (2) odporność na rozszerzenie po kompromitacji stanu — poznanie bieżącego stanu nie ujawnia niczego o wcześniejszych danych wyjściowych.
/dev/urandom i getrandom()
Linux /dev/urandom używa CSPRNG inicjalizowanego na podstawie puli entropii. Po początkowej inicjalizacji (128 bitów entropii) można go bezpiecznie używać nawet wtedy, gdy pula jest „pusta” — CSPRNG utrzymuje własny stan wewnętrzny. getrandom() jest współczesnym odpowiednikiem wywołania systemowego.
CSPRNG oparty na ChaCha20
Jądro Linux 5.17+ zastąpiło swój CSPRNG konstrukcją opartą na ChaCha20. ChaCha20 jest szybki (nie wymaga akceleracji sprzętowej), zapewnia bezpieczeństwo na poziomie 256 bitów i ma dobrze poznany dowód bezpieczeństwa. Nonce pełni funkcję licznika, a klucz pochodzi z puli entropii.
Fortuna
Fortuna (Ferguson & Schneier, 2003) to konstrukcja CSPRNG, która utrzymuje 32 pule entropii i stale gromadzi entropię. Generator jest ponownie inicjalizowany na podstawie pul w miarę ich zapełniania. Jest odporna na ataki polegające na zresetowaniu RNG oraz częściowym przejęciu stanu.
Backdoor DUAL_EC_DRBG
NIST SP 800-90A pierwotnie zawierał DUAL_EC_DRBG oparty na krzywych eliptycznych. Dokumenty Snowdena ujawniły, że NSA umieściła w nim backdoor: punkty krzywej eliptycznej dobrano tak, aby NSA mogła przewidywać dane wyjściowe na podstawie dowolnego ziarna. Nigdy nie należy używać DUAL_EC_DRBG. NIST usunął go w 2014 roku.
CTR_DRBG
CTR_DRBG (NIST SP 800-90A) używa AES w trybie licznika jako CSPRNG. Ziarno = klucz 256-bitowy + nonce 128-bitowy. Każde wywołanie przesuwa licznik. Jest szeroko zaimplementowany w OpenSSL, BoringSSL i Windows BCrypt. Na procesorach z AES-NI korzysta z akceleracji sprzętowej.
HASH_DRBG i HMAC_DRBG
HASH_DRBG wielokrotnie używa funkcji skrótu (SHA-256) wraz z wartością ziarna. HMAC_DRBG używa HMAC do mieszania danych. HMAC_DRBG jest prostszy do poprawnej implementacji i jest używany w wielu systemach wbudowanych (mbedTLS, WolfSSL).
Ponowna inicjalizacja i wstrzykiwanie entropii
Nawet CSPRNG muszą być okresowo ponownie inicjalizowane. CTR_DRBG ma interwał ponownej inicjalizacji wynoszący 2^48 żądań. Fortuna jest ponownie inicjalizowana na podstawie swoich pul entropii. Ręczna ponowna inicjalizacja: przy uruchamianiu oraz po fork() należy dodać do stanu CSPRNG świeżą entropię (bajty z getrandom).
Problem fork()
Po utworzeniu procesu potomnego za pomocą fork() proces macierzysty i potomny dziedziczą ten sam stan CSPRNG — będą generować identyczne dane wyjściowe. Rozwiązanie: natychmiast po fork() wywołać getrandom(), aby ponownie zainicjalizować generator. W nowszych wersjach OpenSSL jest to obsługiwane automatycznie za pomocą pthread_atfork().
CSPRNG w praktyce: Python
import secrets key = secrets.token_bytes(32) # 256-bit key nonce = secrets.token_bytes(12) # 96-bit nonce for AES-GCM pin = secrets.randbelow(10**6) # 6-digit PIN # Never use random module for cryptography
Kryptografia w przeglądarce
window.crypto.getRandomValues(typedArray) to przeglądarkowy CSPRNG. Wywołuje systemowe źródło entropii. Jest używany przez WebCrypto API do generowania kluczy. Nigdy nie należy używać Math.random() do celów bezpieczeństwa — jest to niekryptograficzny PRNG inicjalizowany na podstawie czasu systemowego.
Szybkie sprawdzenie
Jakiego modułu Pythona należy użyć do generowania kryptograficznie losowych bajtów?
Podsumowanie
CSPRNG, takie jak ChaCha20, CTR_DRBG i Fortuna, generują nieprzewidywalne dane wyjściowe na podstawie ziaren entropii. Należy unikać DUAL_EC_DRBG, random.random() i Math.random(). Należy używać secrets (Python) lub window.crypto (przeglądarka). Dalej: rzeczywiste awarie entropii.
Często zadawane pytania
Czy lekcja „Kryptograficznie bezpieczne PRNG” jest bezpłatna?
Tak — pełny tekst „Kryptograficznie bezpieczne PRNG” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cryptology Academy, przejdź na CoddyKit PRO. Kurs Cryptology Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Kryptograficznie bezpieczne PRNG”?
Poznać /dev/urandom, ChaCha20-CSPRNG i Fortunę Ćwiczysz Cryptology Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Cryptology Academy?
Nie wymagamy żadnego doświadczenia. Cryptology Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Kryptograficznie bezpieczne PRNG”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Cryptology Academy?
Tak. Każda lekcja Cryptology Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Prawdziwa losowość a pseudolosowość
- Kryptograficznie bezpieczne PRNG
- Niedobór entropii i błędy związane ze słabymi kluczami
- Bezpieczne generowanie kluczy, nonce’ów i IV