/dev/random
/dev/random
je v informatice název speciálního souboru v unixových systémech, který je rozhraním (API) pro výstup generátoru pseudonáhodných čísel. V Linuxu je generátor implementován uvnitř jádra, kde je též shromažďována entropie a toto rozhraní je tzv. blokující, což znamená, že při nedostatku entropie se čeká, dokud jí není opět dostatek, a volající program do té doby nepokračuje. Neblokující variantou je pak /dev/urandom
, kdy je při nedostatku entropie programu vráceno „méně náhodné číslo“. V jiných systémech může být implementace odlišná.
Linux
Generátor náhodných čísel v prostoru jádra byl implementován poprvé pro Linux v roce 1994 Theodorem Ts'oem. Implementace používala kryptograficky bezpečné hashe místo šifer, aby se zabránilo právnímu omezení, které bylo v platnosti, když byl generátor poprvé navržen. Implementace byla také navrhována s předpokladem, že daný hash nebo šifra by eventuálně mohla být prolomena, a proto byl návrh odolný proti těmto nedostatkům.
V tomto provedení generátor udržuje odhad entropie, tj. odhad počtu bitů šumu v zásobníku entropie. Z této zásoby entropie jsou tvořena náhodná čísla. Při čtení ze zařízení /dev/random
jsou vraceny pouze náhodné bajty v rámci odhadovaného počtu bitů šumu v zásobě entropie. Když je zásoba entropie prázdná, čtení z /dev/random
je blokováno, dokud není shromážděno dostatečné množství šumu. Záměrem je, aby zařízení mohlo sloužit jako kryptograficky bezpečný generátor pseudonáhodných čísel s výstupem o tak velké entropii, jak je to možné, proto by /dev/random
mělo mít vhodné využití při velmi kvalitní náhodnosti, jako například při generování klíčů s vysokou hodnotou nebo pro dlouhodobou ochranu.
Protějškem k /dev/random
je /dev/urandom
(„odemčený / neblokující náhodný zdroj“), který opakovaně produkuje více pseudonáhodných bitů z existující zásoby entropie. Díky tomu není čtení blokující, ale výstup může obsahovat méně entropie než při čtení z /dev/random
. I když je stále vhodný pro většinu kryptografických účelů, není doporučeno ho používat pro tvorbu dlouhodobých kryptografických klíčů.
Do zařízení /dev/random
lze též zapisovat, což umožňuje jakémukoliv uživateli přidat náhodná data do zásoby entropie. Nenáhodná čísla jsou neškodná, neboť pouze privilegovaný uživatel může vydat ioctl (Input/Output Control) potřebný ke zvýšení odhadu entropie. Aktuální množství entropie a velikost zásoby entropie linuxového jádra jsou k dispozici v /proc/sys/kernel/random/
.
Gutterman, Pinkas & Reinman v březnu roku 2006 publikovali detailní analýzu kryptografie linuxového generátoru náhodných čísel, v níž popisují několik slabin. Pravděpodobně nejzávažnější problém se týká vestavěných systémů nebo Live CD, jako jsou routery a bezdiskové stanice, pro něž je stav po bootování předvídatelný a dostupné dodávky entropie mohou být omezené. Pro systémy s nevolatilní pamětí je doporučeno ukládat stav z generátoru náhodných čísel při vypnutí počítače tak, aby mohl být přidán do generátoru při příštím restartu. V případě routeru, pro který síťový provoz představuje hlavní dostupný zdroj entropie, ukládání stavu při restartu nutí potenciální útočníky odposlouchávat celý provoz v síti, od okamžiku, kdy byl router poprvé uveden do provozu, nebo získat přímý přístup k vnitřnímu stavu routeru. Toto je obzvláště kritický problém v případě bezdrátového routeru, jehož provoz v síti může být zachycen z dálky a který může používat generátor náhodných čísel ke generování klíčů pro šifrování dat.
FreeBSD
Operační systém FreeBSD implementuje 256bitovou variantu algoritmu Yarrow, jehož cílem je zajistit bezpečný kryptografický pseudonáhodný tok – toto nahradilo předchozí styl linuxového náhodného zařízení. Na rozdíl od /dev/random
v Linuxu totéž zařízení v FreeBSD nikdy neblokuje. Jeho chování je podobné linuxovému /dev/random
a /dev/urandom
na FreeBSD odkazuje na /dev/random
.
OpenBSD
Od verze OpenBSD 5.1 (1. května 2012) /dev/random
a /dev/arandom
používá algoritmus založený na RC4, ale přejmenovaný, pro licenční účely, na ARC4. Zatímco generování náhodných čísel zde používá systém entropie shromážděné několika způsoby, algoritmus ARC4 poskytuje fail-safe k zajištění rychlého a kvalitního toku pseudonáhodných čísel i při nízké zásobě entropie. Systém automaticky využívá hardwarové generátory náhodných čísel, pokud jsou k dispozici, a to prostřednictvím OpenBSD Cryptographic Framework.
Další operační systémy
/dev/random
a /dev/urandom
jsou dostupné i na systémech Solaris, Mac OS X, NetBSD, Tru64 UNIX 5.1B, AIX 5.2 a HP-UX 11i v2. Stejně jako ve FreeBSD, AIX implementuje vlastní design založený na algoritmu Yarrow, nicméně používá znatelně méně zdrojů entropie než standardní implementace /dev/random
a přestává doplňovat zásobník entropie, když si myslí, že je dostatečně zaplněn.
Podobnou funkcionalitu zajišťuje na systému Windows NT soubor ksecdd.sys
, nicméně čtení \Device\KsecDD
funguje jinak než na unixových platformách. Kryptograficky náhodné bajty jsou generovány metodami CryptGenRandom
a RtlGenRandom
.
Pro DOS je nutno dodat ovladač třetí strany zvaný noise.sys
, jenž vytvoří dvě zařízení: RANDOM$
a URANDOM$
(přístupná přes /DEV/RANDOM$
a /DEV/URANDOM$
), z nichž mohou programy získávat náhodná data.
EGD jako alternativa
Jako současná náhrada pro unixové systémy nepodporující /dev/random
slouží program zvaný EGD (Entropy Gathering Daemon – démon shromažďující entropii). Jedná se o démona produkujícího kryptografická náhodná data. Některé kryptografické softwary jako OpenSSL, GNU Privacy Guard a Apache HTTP Server podporují využití EGD, když není k dispozici /dev/random
.
EGD (nebo kompatibilní alternativa jako PRNGD) sbírá entropii z různých zdrojů, zpracovává ji, aby vylepšil kryptografickou kvalitu, a následně ji dává k dispozici pomocí unixového domain socketu (obvykle /dev/egd-pool
) nebo pomocí TCP socketu. Sbírání entropie obvykle probíhá pomocí periodicky se větvících podprocesů, jež sbírají často se měnící a těžce předvídatelné informace ze systému, jako například stav CPU, I/O a sítě společně s obsahy různých logovacích souborů a dočasných adresářů.
EGD používá pro komunikaci s programy, jež si žádají náhodná data, jednoduchý protokol. Klient se připojí k EGD socketu a vyšle příkaz identifikovaný hodnotou prvního oktetu:
- příkaz 0: zjištění množství právě dostupné entropie. EGD vrací 4bajtové číslo ve formátu big-endian, jež reprezentuje počet náhodných bajtů, které je možno ihned poskytnout.
- příkaz 1: sběr náhodných bajtů bez blokování. Druhý bajt v dotazu říká, kolik náhodných bajtů má EGD vrátit (od 1 do 255). Pokud si klient vyžádá více bajtů, než je právě k dispozici, budou mu ihned vrácena všechna dostupná data, a to i kdyby byl zásobník prázdný. První oktet v odpovědi indikuje, kolik bajtů s náhodnými daty bude následovat.
- příkaz 2: sběr náhodných bajtů s blokováním. Druhý bajt v dotazu říká, kolik náhodných bajtů má EGD vrátit. Pokud není k dispozici dostatek entropie, čeká se, než bude zásobník zaplněn tak, aby uspokojil klientem určené množství. Také na rozdíl od příkazu 1 začíná odpověď od EGD přímo náhodnými daty, neboť klient vždy dostane požadované množství bajtů.
- příkaz 3: aktualizace entropie. Tento příkaz umožňuje klientovi dodávat vlastní entropii do interního zásobníku EGD. Následující dva bajty, interpretovány jako 16bitový big-endian integer, indikující, kolik bitů entropie klient dodává. Čtvrtý bajt indikuje, kolik dalších bajtů bude za příkazem následovat. EGD démon může přimíchat tuto entropii do své. Příkaz nic nevrací.