Měl bych jen připomínku k /dev/random vs. /dev/urandom. A totiž že /dev/urandom není méně náhodný, ale je úplně stejný. Více viz třeba https://www.2uo.de/myths-about-urandom
Tak random a urandom nejsou úplně stejné. Random je náhodná sekcence a urandom pseudonáhodná sekvence jen se seedem z random. Z toho třeba plyne, že na systému se špatným random a tím pádem s málo entropií by se dalo urandom lehčeji uhodnout. Proto je HW rng důležitý i pro ty, kdo třeba z přesvědčení nebo kvůli rychlosti používají výlučně urandom.
random i urandom jsou CSPRNG. Bohužel je to tak, že je to právě naopak - /dev/random používají lidé třeba z přesvědčení, a nikoli na základě fakt.
Slidedeck: https://speakerdeck.com/filosottile/the-plain-simple-reality-of-entropy-at-32c3
Přednáška: https://media.ccc.de/v/32c3-7441-the_plain_simple_reality_of_entropy
TL;DR Používejte /dev/urandom. Jediný problém je early boot - použijte "getrandom()" nebo načtěte jeden byte z /dev/random.
Ano, toto je dost kontroverzní téma.
"random i urandom jsou CSPRNG":
Ale u /dev/random se ten CSPRNG používá jen místo "software whitening", protože prakticky každý HW RNG dává například více jedniček než nul. To může záviset třeba na teplotě a je to nežádoucí.
/dev/random ale vezme jen tu entropii, co do ní z HW nateče, tu transformuje, aby byla vyvážená a pustí do výstupu. /dev/urandom si entropii "domýšlí", když už na vstupu dojde. Proto je /dev/urandom v principu pseudonáhodný a /dev/random náhodný, i když používají stejný algoritmus.
/dev/random žádnou entropii nevyvažuje. /dev/random jen odhaduje kolik jí tak může být. Oba (/dev/random a /dev/urandom) zdroje totiž používají ten samý "pseudonáhodný" CSPRNG (Cryptographically secure RNG) s tím, že /dev/random umí blokovat, když počitadlo klesne příliš nízko. Jenže s výjimkou bootu to už je jedno. Jak byl jednou ten CSPRNG dostatečně naseedovaný, tak generuje sekvenci nerozlišitelnou od šumu.
Ještě jednou doporučuji si přečíst https://www.2uo.de/myths-about-urandom nebo alespoň ty citace na konci:
- https://www.mail-archive.com/cryptography@randombit.net/msg04763.html
- https://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/
- https://security.stackexchange.com/questions/3936/is-a-rand-from-dev-urandom-secure-for-a-login-key/3939#3939
Toto téma není mezi odborníky kontroverzní ani trochu. Kryptologové doporučují na linuxu používat /dev/urandom.
Hwrng je důležité pro virtuální stroje, protože se dost typicky vytvářejí z šablon a mají velmi podobnou zátěž. Virtuální počítače také typicky nemají moc zdrojů náhodných dat (žádná klávesnice, myš, teplota, ..). Seed CSPRNG v takovém případě dostává shodná data při bootu a tudíž by mohlo dojít ke generování stejné sekvence třeba pro prvotní inicializaci soukromých klíčů ssh. Hwrng dodá každé VM jiná data z hosta a tím zajistí unikátnost.
To jsou ovšem věci, které nemají vliv na rozdíl /dev/random a /dev/urandom. Jednoduché pravidlo pro vývojáře aplikací je: Používejte /dev/urandom. Vždy a všude.
V případě Guest strojů je hlavně důležité použít <a href=“ https://fedoraproject.org/wiki/Features/Virtio_RNG”>VirtIO RNG a jsme zpátky jen u Early Boot problému. A pak samozřejmě takové blbosti jako nemít uložený stejný seed v image, kterou klonuju, atp...
Moje zpráva je (skoro) stejná jako ta Vaše - používejte /dev/urandom, případně ještě lépe getrandom() volání. A pokud potřebujete jedno stejné rozhraní na různých platformách, použijte crypto knihovnu (libcrypto, GnuTLS). Vždy a všude.