Random Number Generator, czyli RNG, to urządzenie lub program wytwarzający wartości liczbowe. Portfel potrzebuje generatora bezpiecznego kryptograficznie: znajomość wcześniejszych wyników lub czasu utworzenia nie może pozwalać atakującemu na praktyczne przewidzenie nowego sekretu. Liczą się źródło entropii, algorytm i sposób wykorzystania go przez aplikację. Entropia opisuje tu niepewność, jaka pozostaje atakującemu co do wyniku.
Wyobraź sobie portfel, który wyprowadza sekret wyłącznie z aktualnego czasu. Wynik może wyglądać skomplikowanie, ale osoba znająca moment utworzenia portfela miałaby znacznie mniej możliwości do sprawdzenia. RFC 4086 ostrzega właśnie przed takimi przewidywalnymi danymi. Generator dobry do gry lub symulacji nie musi więc nadawać się do kluczy. Nawet poprawny rozkład statystyczny sam nie dowodzi bezpieczeństwa. [2]
Zwykle współpracuje kilka elementów. Źródło dostarcza niepewność, jego wyjście jest w razie potrzeby przetwarzane, a kryptograficzny generator deterministyczny tworzy kolejne wartości na podstawie tajnego stanu wewnętrznego. Deterministyczny oznacza, że ten sam stan wewnętrzny i te same dane wejściowe dają ten sam wynik. Dlatego stan musi pozostać tajny. Aplikacja pobiera je przez interfejs systemu. Każdy zwrócony bit nie wymaga zatem nowego pomiaru fizycznego. NIST SP 800-90C opisuje łączenie generatorów zgodnych z 90A ze źródłami według 90B. [1]
W BIP39 podstawa do odtworzenia portfela powstaje jeszcze przed pierwszym słowem: generator wytwarza od 128 do 256 bitów początkowej entropii. Bit to podstawowa jednostka informacji, zero lub jedynka. Ważne, aby atakujący nie mógł przewidzieć powstałego ciągu. Dodawana jest suma kontrolna, krótka wartość pomagająca wykryć niektóre błędy zapisu, a całość zostaje zamieniona na słowa odzyskiwania. Możesz uzupełnić je o passphrase, czyli dodatkowy tajny tekst. Funkcja PBKDF2 wyprowadza z tych danych 512-bitowy seed: tajną wartość początkową, z której powstają klucze portfela. Ani dłuższy wynik, ani suma kontrolna nie uzupełnią brakującej losowości. Dlatego nie wybieraj słów odzyskiwania samodzielnie. [6]
Urządzenie musi wykrywać usterki, na przykład powtarzanie jednej wartości przez źródło szumu. NIST SP 800-90B wymaga więc kontroli przy uruchomieniu i w trakcie pracy oraz obsługi wykrytych awarii. Nie można ignorować błędu i nadal przedstawiać wyniku jako zweryfikowanej losowości. Te kontrole dotyczą źródła; nie gwarantują bezpieczeństwa całego portfela. [3]
Generator deterministyczny przechowuje stan wewnętrzny, z którego oblicza dalsze wyniki. NIST SP 800-90A opisuje jego utworzenie, generowanie, dodawanie świeżej entropii (reseed) i zakończenie działania. Po ujawnieniu stanu kolejne wywołanie nie musi przywrócić bezpieczeństwa. Potrzebny jest odpowiedni mechanizm oraz nowa entropia nieznana atakującemu. Nie odbiera mu to wcześniej ujawnionych kluczy. [7]
Nie musisz samodzielnie programować RNG. Sprawdź raczej, czy konkretna wersja portfela ma udokumentowane generowanie wartości i obsługę błędów. Sam napis „hardware” lub „offline” tego nie potwierdza. Przegląd musi obejmować źródło, algorytm, inicjalizację i interfejs aplikacji. Nawet poprawnie utworzony sekret traci ochronę, jeśli później ujawnisz jego kopię zapasową. [1] [2]
Domyślnie getrandom() w Linuksie czeka na inicjalizację urandom; z GRND_NONBLOCK może zamiast tego zwrócić EAGAIN. Po inicjalizacji żądanie do urandom obejmujące najwyżej 256 bajtów ma gwarancję pełnego odczytu bez przerwania sygnałem. Większe żądania nie mają tej gwarancji. Program musi sprawdzać wynik wywołania i liczbę faktycznie otrzymanych bajtów. [4]
Web Crypto udostępnia getRandomValues() do wypełniania obsługiwanej tablicy liczb całkowitych wartościami silnymi kryptograficznie. Powyżej 65536 bajtów zgłasza QuotaExceededError. Do kluczy obsługiwanych algorytmów specyfikacja zaleca generateKey(); nie jest to uniwersalny generator portfeli Bitcoin. Poprawne użycie API nie dowodzi też wiarygodności strony: jej kod może mieć dostęp do utworzonego sekretu. [5]
Pełniejszy obraz uzyskasz, czytając to hasło razem z Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. Do tego hasła prowadzą również odsyłacze z CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.