Mám použít /dev/random
nebo /dev/urandom
?
V jakých situacích bych preferoval jedno před druhým?
Přijatá odpověď:
TL;DR
Použijte /dev/urandom
pro většinu praktických účelů.
Delší odpověď závisí na variantě Unixu, který používáte.
Linux
Historicky /dev/random
a /dev/urandom
byly představeny ve stejnou dobu.
Jak v komentáři zdůraznil @DavidSchwartz pomocí /dev/urandom
je preferován v naprosté většině případů. On a další také poskytli odkaz na vynikající mýty o /dev/urandom
článek, který doporučuji k dalšímu přečtení.
Shrnuto:
- Manuálová stránka je zavádějící.
- Oba jsou napájeny stejným CSPRNG ke generování náhodnosti (diagramy 2 a 3)
/dev/random
blokuje, když mu dojde entropie,
takže čtení z/dev/random
může zastavit provádění procesu.- Množství entropie se konzervativně odhaduje, ale nepočítá
/dev/urandom
nikdy nezablokuje.- Ve vzácných případech velmi krátce po spuštění nemusí mít CSPRNG dostatek entropie, aby mohl být správně nasazen a
/dev/urandom
nemusí vytvářet vysoce kvalitní náhodnost. - Docházející entropie není problém, pokud byl CSPRNG původně správně nasazen.
- CSPRNG se neustále znovu nasazuje.
- V systému Linux 4.8 a novějším
/dev/urandom
nevyčerpává zásobu entropie (používá se/dev/random
), ale používá výstup CSPRNG z upstreamu. - Použijte
/dev/urandom
.
Výjimky z pravidla
V Cryptography Stack Exchange's Kdy použít /dev/random
přes /dev/urandom
v Linuxu poskytuje @otus dva případy použití:
-
Krátce po spuštění na zařízení s nízkou entropií, pokud ještě nebylo vygenerováno dostatečné množství entropie pro správné nasazení
/dev/urandom
. -
Generování jednorázového bloku s teoretickou informační bezpečnost
Pokud se obáváte (1), můžete zkontrolovat dostupnou entropii v /dev/random
.
Pokud děláte (2), už to víte 🙂
Poznámka:Můžete zkontrolovat, zda se čtení z /dev/random zablokuje, ale dejte si pozor na možné závody.
Alternativa:nepoužívejte ani jedno!
@otus také poukázal na to, že getrandom()
systém bude číst z /dev/urandom
a blokovat pouze v případě, že počáteční entropie semene není k dispozici.
Při změně /dev/urandom
dochází k problémům použít getrandom()
, ale je možné, že nový /dev/xrandom
zařízení je vytvořeno na základě getrandom()
.
macOS
Na tom nezáleží, jak říká Wikipedie:
macOS používá 160bitový Yarrow založený na SHA1. Mezi /dev/random a /dev/urandom není žádný rozdíl; oba se chovají identicky. Apple iOS také používá Yarrow.
FreeBSD
Na tom nezáleží, jak říká Wikipedie:
/dev/urandom
je pouze odkaz na/dev/random
a blokuje pouze do správného nasazení.
To znamená, že po nabootování je FreeBSD dost chytré na to, aby počkalo, až se shromáždí dostatek entropie semene, a teprve potom začne dodávat nekonečný proud náhodných dobrot.
Související:Linux – Jak přimět Oracle java 7, aby fungoval s setcap cap_net_bind_service+ep?NetBSD
Použijte /dev/urandom
, za předpokladu, že váš systém četl alespoň jednou z /dev/random
k zajištění správného počátečního výsevu.
Manuová stránka rnd(4) říká:
/dev/urandom
nikdy neblokuje.
/dev/random
někdy blokuje. Zablokuje se brzy při spouštění, pokud je
stav systému znám jako předvídatelný.Aplikace by měly číst z
/dev/urandom
když potřebují náhodně
generovaná data, např. kryptografické klíče nebo semena pro simulace.Systémy by měly být navrženy tak, aby uvážlivě četly alespoň jednou z
/dev/random
při startu před spuštěním jakýchkoli služeb, které komunikují s
internetem nebo jinak vyžadují kryptografii, aby se předešlo
předvídatelnému generování klíčů.