Les deux /dev/random
et /dev/urandom
utilisent une «piscine entropique». Lorsque le pool est épuisé, /dev/random
attend qu'il se remplisse, ce qui nécessite de surveiller le comportement du système (saisie au clavier, mouvement de la souris, etc.), alors /dev/urandom
qu'il continuera à vous fournir des données pseudo-aléatoires. /dev/random
est théoriquement de meilleure qualité, mais /dev/urandom
est presque certainement assez bonne pour vos besoins. (Mais même /dev/urandom
est probablement plus lent que certaines autres méthodes. Un générateur plus rapide mais de qualité inférieure est probablement assez bon pour effacer les disques durs. Il n'est pas clair qu'un attaquant gagnerait à connaître la séquence qui va être générée, ou que les nombres aléatoires sont meilleurs à cet effet qu'une séquence comme 0, 1, 2, 3, 4, ....)
Citant la random(4)
page de manuel:
Si vous ne savez pas si vous devez utiliser /dev/random
ou
/dev/urandom
, alors vous voudrez probablement utiliser ce dernier. En règle générale, /dev/urandom
doit être utilisé pour tout sauf les clés GPG / SSL / SSH à longue durée de vie.
MISE À JOUR : La page de manuel `random (4) a été mise à jour depuis que j'ai écrit cela. Il dit maintenant:
L' /dev/random
interface est considérée comme une interface héritée, et
/dev/urandom
est préférée et suffisante dans tous les cas d'utilisation, à l'exception des applications qui nécessitent un caractère aléatoire au début du démarrage; pour ces applications, getrandom(2)
doit être utilisé à la place, car il se bloquera jusqu'à ce que le pool d'entropie soit initialisé.
Voir aussi " Mythes sur / dev / urandom " par Thomas Hühn.
Mais /dev/urandom
, même s'il ne se bloque pas, il est probable qu'il soit trop lent si vous souhaitez générer d'énormes quantités de données. Prenez quelques mesures sur votre système avant de l'essayer.
EDIT: Ce qui suit est une digression sur les «vrais» nombres aléatoires par rapport aux nombres pseudo-aléatoires. Si tout ce qui vous intéresse est une réponse pratique à la question, vous pouvez arrêter de lire maintenant.
Il me semble que les revendications (y compris dans d'autres réponses ici) /dev/random
implémentent un "vrai" générateur de nombres aléatoires, par opposition à un générateur de nombres pseudo-aléatoires (PRNG). Par exemple, l'article Wikipedia fait une telle affirmation. Je ne pense pas que ce soit correct. Il y a une discussion à ce sujet ici qui se réfère aux générateurs de nombres aléatoires matériels, mais je ne vois aucune preuve qui /dev/random
utilise généralement un tel appareil, ou que les ordinateurs typiques ont même un tel appareil. Ils diffèrent des PRNG comme la rand()
fonction C en ce qu'ils ne sont pas déterministes, car ils récoltent l'entropie à partir de sources pratiquement imprévisibles.
Je dirais qu'il existe trois classes de générateurs de nombres "aléatoires":
Des PRNG déterministes, comme la rand()
fonction de C , qui utilisent un algorithme pour générer des séquences répétables qui ont (plus ou moins) les propriétés statistiques d'une séquence vraiment aléatoire. Ceux-ci peuvent être assez bons pour les jeux (étant donné un bon moyen de les semer), et sont nécessaires pour les applications qui nécessitent une répétabilité, mais ils ne conviennent pas à la cryptographie.
Les générateurs aiment /dev/random
et /dev/urandom
qui récoltent l'entropie d'une source pratiquement imprévisible comme l'activité d'E / S (c'est pourquoi frapper sur le clavier ou déplacer la souris peut entraîner la /dev/random
production de plus de données). Il n'est pas clair (pour moi) si ceux-ci répondent à la définition d'un PRNG (j'ai vu des définitions qui disent qu'un PRNG est déterministe), mais ce ne sont pas non plus de véritables générateurs de nombres aléatoires.
Générateurs de nombres aléatoires matériels qui sont physiquement imprévisibles même avec une connaissance complète de leur état initial, et qui utilisent en outre des techniques mathématiques pour garantir les bonnes propriétés statistiques.