/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í.

Související články