Devrais-je utiliser /dev/random
ou /dev/urandom
?
Dans quelles situations est-ce que je préférerais l'un plutôt que l'autre?
Devrais-je utiliser /dev/random
ou /dev/urandom
?
Dans quelles situations est-ce que je préférerais l'un plutôt que l'autre?
Réponses:
Utilisez /dev/urandom
à des fins plus pratiques.
La réponse la plus longue dépend de la version d’Unix que vous utilisez.
Historiquement, /dev/random
et /dev/urandom
ont tous deux été introduits en même temps.
Comme @DavidSchwartz l'a souligné dans un commentaire , l'utilisation /dev/urandom
est préférable dans la grande majorité des cas. Lui et d'autres ont également fourni un lien vers l'excellent article Myths about/dev/urandom
que je recommande aux lecteurs de lire davantage.
En résumé:
/dev/random
bloque quand il manque d'entropie/dev/urandom
ne bloquera jamais, la lecture de /dev/random
peut arrêter l'exécution des processus./dev/urandom
peut ne pas produire un caractère aléatoire de haute qualité./dev/urandom
le pool d'entropie (utilisé par /dev/random
) n'est pas épuisé, mais la sortie CSPRNG est utilisée en amont./dev/urandom
.Exceptions à la règle
Dans la pile de Cryptography échange Quand utiliser /dev/random
plus /dev/urandom
sous Linux
@otus donne deux cas d'utilisation :
Peu de temps après l’amorçage sur un périphérique à entropie faible, si suffisamment d’entropie n’a pas encore été générée pour permettre un amorçage correct /dev/urandom
.
Si vous êtes inquiet pour (1), vous pouvez vérifier l’entropie disponible dans/dev/random
.
Si vous faites (2) vous le saurez déjà :)
Remarque: vous pouvez vérifier si la lecture de / dev / random bloquera , mais méfiez-vous des conditions de concurrence possibles.
Alternative: n'utilisez ni l'un ni l'autre!
@otus a également souligné que le getrandom()
système lirait /dev/urandom
et ne bloquerait que si l'entropie initiale de la graine n'était pas disponible.
Il est difficile de changer /dev/urandom
d’utilisationgetrandom()
, mais il est concevable de créer un nouveau /dev/xrandom
périphérique en fonction de celui-ci getrandom()
.
Cela n'a pas d'importance, comme le dit Wikipedia :
macOS utilise Yarrow 160 bits basé sur SHA1. Il n'y a pas de différence entre / dev / random et / dev / urandom; les deux se comportent de manière identique. Apple iOS utilise également Yarrow.
Cela n'a pas d'importance, comme le dit Wikipedia :
/dev/urandom
n’est qu’un lien vers/dev/random
et ne bloque que jusqu’à ce qu’il soit correctement ensemencé.
Cela signifie qu’après le démarrage, FreeBSD est suffisamment intelligent pour attendre jusqu’à ce que suffisamment d’entropie ait été collectée avant de fournir un flux sans fin de qualité aléatoire.
Utilisez-le /dev/urandom
, en supposant que votre système l’a lu au moins une fois /dev/random
pour garantir un ensemencement initial correct.
La page de manuel rnd (4) indique :
/dev/urandom
Ne bloque jamais.
/dev/random
Parfois des blocs. Bloquera tôt au démarrage si l'état du système est prévisible.Les applications doivent lire dans / dev / urandom quand elles ont besoin de données générées aléatoirement, telles que des clés cryptographiques ou des bases de données de simulation.
Les systèmes doivent être conçus pour lire judicieusement au moins une fois dans / dev / random au démarrage avant de lancer des services qui parlent à Internet ou qui nécessitent une cryptographie, pour éviter de générer des clés de manière prévisible.
/dev/urandom
- Sauf qu’il n’existe pas /dev/urandom
de système OpenBSD. OpenBSD a /dev/arandom
, mais vous n'êtes pas censé l'utiliser, vous devriez arc4random(3)
plutôt utiliser la fonction. Peut-être que des conseils sur des dispositifs et des fonctions aléatoires devraient être laissés à des personnes qui comprennent réellement de quoi il s'agit?
/dev/random
bloque quand il n'y a plus d'entropie" - Sous Linux, cela dépend de la manière dont vous ouvrez le périphérique. Si les open
drapeaux incluent, O_NONBLOCK
cela ne bloquera pas. S'il n'y a pas d'entropie, l'appel retournera immédiatement et indiquera 0 octets lus.
/dev/random
est seulement (ex :) 60 octets, vous dd
obtiendrez un fichier de 60 octets. L'utilisation head
dans le même scénario donnera probablement l'impression d'être suspendue pour toujours. Ni fait ce que vous voulez, mais, au moins pour moi, il est plus évident que head
ne fait pas ce qui était attendu.
Traditionnellement, la seule différence entre /dev/urandom
et /dev/random
est ce qui se produit lorsque le noyau pense qu’il n’ya pas d’entropie dans le système - /dev/random
échec fermé, /dev/urandom
échec ouvert. Les deux pilotes ont été l' entropie de approvisionnent add_disk_randomness()
, add_interrupt_randomness()
et add_input_randomness()
. Voir /drivers/char/random.c
pour plus de détails.
Édité pour ajouter: À partir de Linux 4.8 a /dev/urandom
été retravaillé pour utiliser CSPRNG.
Alors, quand devriez-vous échouer fermé? Pour tout type d'utilisation cryptographique, en particulier l'ensemencement de DRBG. Il existe un très bon article expliquant les conséquences de l’utilisation /dev/urandom
lors de la génération de clés RSA et du manque d’entropie. Lisez Mining Your Ps and Qs .
C'est en quelque sorte une réponse "moi aussi", mais cela renforce la recommandation de Tom Hale. Cela s'applique carrément à Linux.
/dev/urandom
/dev/random
Selon Theodore Ts'o, sur la liste de diffusion Linux Kernel Crypto, /dev/random
est déconseillé depuis une décennie. De Re: [RFC PATCH v12 3/4] Générateur de nombres aléatoires Linux :
Pratiquement personne n'utilise / dev / random. C'est essentiellement une interface obsolète; Les principales interfaces recommandées depuis plus de dix ans sont / dev / urandom et maintenant getrandom (2).
Nous testons régulièrement /dev/random
et il subit des échecs fréquents. Le test effectue les trois étapes suivantes: (1) drainer /dev/random
en demandant 10K octets en mode non bloquant; (2) demander 16 octets en mode bloquant (3) essayer de compresser le bloc pour voir s'il est aléatoire (test de l'homme pauvre). Le test prend quelques minutes à compléter.
Le problème est si grave sur les systèmes Debain (i686, x86_64, ARM et MIPS) que nous avons demandé à GCC Compile Farm d’installer le rng-tools
paquet pour leurs machines de test. À partir de rng-tools sur gcc67 et gcc68 :
Je voudrais demander que les outils rng soient installés sur gcc67 et gcc68. Ce sont des systèmes Debian et / dev / random souffre d’épuisement d’entropie sans outils rng lors de tests de torture des bibliothèques qui utilisent le périphérique.
Les BSD et OS X semblent OK. Le problème est définitivement Linux.
Il convient également de mentionner que Linux ne consigne pas les erreurs du générateur de journaux. Ils ne voulaient pas que les entrées remplissent le journal système. À ce jour, la plupart des échecs sont silencieux et ne sont pas détectés par la plupart des utilisateurs.
La situation devrait bientôt changer car le noyau va imprimer au moins un message d'échec. De [PATCH] random: élimine les avertissements du compilateur et corrige la course sur la liste de diffusion cryptée du noyau:
Plus précisément, j'ai ajouté
depends on DEBUG_KERNEL
. Cela signifie que ces avertissements utiles ne toucheront que les autres développeurs du noyau. C'est probablement exactement ce que nous voulons. Si les différents développeurs associés voient un avertissement provenant de leur sous-système particulier, ils seront plus motivés pour le résoudre. Les utilisateurs ordinaires sur les noyaux de distribution ne devraient pas voir les avertissements ni le spam, car généralement les utilisateurs n'utilisent pas DEBUG_KERNEL.Je pense que c'est une mauvaise idée de supprimer tous les messages du point de vue de l'ingénierie de la sécurité.
Beaucoup de gens ne courent pas les noyaux de débogage. La plupart des utilisateurs qui souhaitent ou ont besoin de connaître les problèmes ne réalisent pas que cela se produit. Considérez que la raison pour laquelle nous avons appris les problèmes de systemd était due à dmesg.
La suppression de tous les messages pour toutes les configurations génère un réseau plus large que nécessaire. Les configurations susceptibles d'être détectées et corrigées passeront probablement inaperçues. Si le problème n'est pas mis au jour, il ne sera pas corrigé.
J'ai l'impression que le noyau prend des décisions stratégiques pour certaines organisations. Pour ceux dont le matériel est effectivement non corrigible, l’organisation doit décider quoi faire en fonction de son adversité en matière de risque. Ils peuvent décider de supporter le risque ou d’actualiser le matériel. Cependant, sans informations sur la question, ils peuvent même ne pas se rendre compte qu'ils ont un élément pouvant faire l'objet d'une action
Le compromis finalement atteint plus tard dans le thread était au moins un dmesg par module appelant.