482 / 736CSPRNG

CSPRNG

Kryptograficky bezpečný generátor pseudonáhodných čísel

Když peněženka potřebuje nové tajemství, nestačí číslo, které jen vypadá náhodně. CSPRNG má zajistit, aby útočník nedokázal další hodnoty prakticky předpovědět ani po přečtení části výstupu.

CSPRNG je kryptograficky bezpečný generátor pseudonáhodných čísel. Z tajného vnitřního stavu vypočítává další hodnoty podle přesného postupu. Slovo „pseudonáhodný“ zde neznamená nekvalitní: výpočet je opakovatelný, ale pro člověka bez znalosti tajného stavu mají být jeho výsledky prakticky nepředvídatelné. Potřebuje k tomu dostatečnou entropii, tedy vstupní nejistotu, kterou útočník nezná, a správné zapojení do aplikace.

Představte si program, který vytváří tajné hodnoty pro peněženku. Útočník některé jeho dřívější výstupy zjistí. Bezpečný generátor mu tím nesmí usnadnit odhad těch zbývajících. To je náročnější požadavek než hezké rozložení čísel v grafu. RFC 4086 proto odlišuje kryptograficky silné posloupnosti od běžných generátorů pro simulace. Ani dobrý výsledek statistického testu nestačí, pokud lze uhodnout seed, výchozí hodnotu, ze které generování začalo. [1]

V odborné dokumentaci narazíte také na DRBG, deterministický generátor náhodných bitů. „Deterministický“ znamená, že při stejném stavu a stejných vstupech vznikne stejný výsledek; stav proto musí zůstat tajný. NIST SP 800-90A Rev. 1 popisuje konkrétní mechanismy Hash_DRBG, HMAC_DRBG a CTR_DRBG. Jde o technické postupy, nikoli o známku kvality pro každý program, který jejich jméno používá. Při kontrole záleží také na nastavení, původu entropie a skutečném provedení kódu. [2]

Únik stavu otevírá dvě různé otázky. Dokáže útočník dopočítat dřívější tajné výsledky? A dokáže předpovídat další? Ochrana minulých výstupů se nazývá Backtracking resistance; ochrana budoucích Prediction resistance. NIST SP 800-90A u té druhé vyžaduje účinné doplnění čerstvé entropie, která oddělí nové výsledky od vyzrazeného stavu. Pouhé další spuštění výpočtu nemusí bezpečnost vrátit. Ani přítomnost jedné z těchto ochran automaticky nedokazuje druhou. [2]

Knihovna je hotová softwarová součást, kterou může peněženka využít. Ani její volání ale nemusí uspět. OpenSSL 3.5 u funkcí RAND_bytes() a RAND_priv_bytes() vrací 1 při úspěchu, 0 při jiné chybě a -1, pokud aktuální metoda není podporována. Při selhání zdroje entropie může generování odmítnout. Program musí tento výsledek zkontrolovat, než použije připravené místo v paměti, takzvaný buffer. Jinak může pracovat s daty, která vůbec nebyla bezpečně vytvořena. [3]

Opakovatelnost je užitečná při testování: vývojář chce znovu dostat stejný výsledek a porovnat ho s očekáváním. Funkce libsodium randombytes_buf_deterministic() proto ze stejného seedu vytvoří stejnou posloupnost. V provozu ale nechtěné opakování vadí. Snímek virtuálního stroje je uložený stav počítače včetně jeho paměti; po obnovení se může zopakovat i stav generátoru a jeho výstup. Kopie prostředí tedy nemusí vytvářet nezávislá tajemství. [4]

Generátor může dodat kvalitní náhodná data a aplikace je přesto zpracuje špatně. Když je převádí do menšího povoleného rozsahu prostým zbytkem po dělení, mohou některé výsledky vycházet častěji než jiné. Funkce libsodium randombytes_uniform() tento problém řeší rovnoměrným výběrem pod zadanou horní mezí. Pro klíče navíc platí pravidla konkrétního algoritmu. Bezpečnost proto nekončí získáním náhodných bajtů: záleží i na jejich dalším použití. [4]

Nonce je hodnota určená pro jednotlivé použití v kryptografickém postupu. Její pravidla ale určuje daný protokol. RFC 8439 vyžaduje, aby se nonce neopakoval se stejným klíčem; náhodný vzhled sám jedinečnost nezaručuje. RFC 6979 naopak popisuje, jak hodnotu k potřebnou pro digitální podpis vypočítat deterministicky z tajného klíče a podepisované zprávy. Nejde o protimluv, ale o jiný návrh. Pokyn „všude přidejte náhodnost“ proto bezpečný postup nenahrazuje. [5] [6]

Samotný nápis CSPRNG ještě neříká, zda peněženka celé řešení používá správně. Technická kontrola sleduje konkrétní verzi knihovny, spuštění generátoru, řešení chyb i chování po obnovení nebo zkopírování stavu. Dokumentace OpenSSL a libsodium dokládá vlastnosti jejich funkcí, ne bezpečnost každé aplikace, která je zavolá. Pro uživatele je podstatné i pokračování příběhu: dokonale vytvořené tajemství přestane chránit peníze, pokud později unikne záloha, ze které se dá obnovit přístup. [3] [4]

Pro nejúplnější obraz čtěte toto heslo společně s Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. Opačným směrem na něj odkazují také Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.

DOC · 001RFC 4086 — Cryptographically strong sequencesSpecifikace DOC · 002NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistanceSpecifikace DOC · 003OpenSSL 3.5 — RAND_bytes return values and errorsDokumentace DOC · 004libsodium — Random data and deterministic testingDokumentace DOC · 005RFC 8439 — Nonce uniquenessSpecifikace DOC · 006RFC 6979 — Deterministic signingSpecifikace
Revidováno: Primární zdroje · Nejde o investiční doporučení