Comment générer de meilleurs nombres aléatoires sur la ligne de commande Bash –
Générer des nombres aléatoires dans bash semble simple à faire en utilisant le $RANDOM
variable, mais la variable est-elle vraiment si aléatoire? Découvrez ce qui peut vous empêcher de générer des nombres aléatoires de haute qualité, et plus encore!
Numéros aléatoires au terminal
Il semble simple de générer un nombre aléatoire dans Bash:
Mais le nombre est-il vraiment aléatoire?
Pas vraiment, comme on peut le voir. Le générateur de nombres aléatoires dans Bash dépend d’une graine – une valeur transmise à la fonction de génération de nombres aléatoires – qui, à condition que la graine soit la même, générera toujours la même séquence de nombres aléatoires que l’exemple de sortie ci-dessus le montre.
Nous pouvons initialiser le générateur de nombres aléatoires avec une valeur de départ en définissant le RANDOM
variable à la valeur de départ souhaitée. Alors peut-être pouvons-nous fournir un nombre aléatoire comme graine au générateur aléatoire?
Cela semble fonctionner un peu, chaque fois que nous voulons générer un nombre aléatoire, nous pré-ensemencons le générateur de nombres aléatoires avec un nombre généré aléatoirement. Mais tout ce que nous avons fait, c’est nous piéger pendant un petit moment; nous venons de créer une couche supplémentaire de profondeur, mais le résultat est à peu près le même; les nombres ne sont pas aléatoires et peuvent être influencés par une graine fixe fournie plus tôt.
Ce problème est appelé un problème de génération «d’entropie aléatoire». Plus nous pouvons générer d’entropie, meilleurs seront nos nombres aléatoires. Ce problème particulier n’est pas limité à Bash uniquement, il existe dans tous les systèmes informatiques de base qui tentent de générer des nombres aléatoires. Le hasard n’est donc jamais vraiment aléatoire. Certains autres systèmes aléatoires utilisent par exemple des mouvements de souris et des coups de clavier et d’autres entrées semi-aléatoires en combinaison pour augmenter la complexité du pool d’entropie aléatoire.
Alors, comment pouvons-nous générer un nombre aléatoire «assez bon» pour être nommé vraiment aléatoire?
Pour cela, nous aurions besoin, en tant que source et semence, de quelque chose qui est vraiment, ou presque vraiment, aléatoire. Nous pourrions penser à utiliser la date d’aujourd’hui, mais ce n’est pas très aléatoire à la réflexion. Qu’en est-il des secondes depuis 00:00:00 UTC le 1er janvier 1970 (généralement appelées «époque» dans les cercles Linux)? Peut-être, mais tout ce dont on a besoin est un fichier journal quelque part et l’époque peut être reconstruite.
Une meilleure solution consiste à utiliser les chiffres les moins significatifs de la minuterie de précision nanoseconde:
En principe, même cela n’est pas parfait. Cela peut tomber sous l’en-tête de «meilleure génération de nombres aléatoires» selon le titre de cet article, mais l’entropie n’est pas parfaite par définition. Regardons cela d’un peu plus près.
Dans l’exemple, nous prenons les octets 4 à 9 ou 6 nombres de l’époque, exprimés par date +%N
et sortie à la suite du sous-shell lancé par $(...)
. Cela signifie que notre graine minimum est 0 et notre graine maximum est 999999. Ce n’est qu’une plage de 1 million de nombres.
En principe, ce système pourrait encore être «piraté»: on pourrait simplement parcourir tous ces 1 million de nombres et saisir les séquences de nombres aléatoires générées à partir de cela. Ce serait sûrement une très mauvaise solution pour une génération de clé de chiffrement, par exemple!
Si nous sélectionnons moins de nombres, le risque pour cela augmente. Si nous en sélectionnons plus, le risque devient plus petit, mais la «graine aléatoire» devient également moins aléatoire. Cela peut être illustré en incluant les secondes depuis l’époque:
On voit passer les secondes! Notez l’initiale 6> 7> 8 etc.
À des fins de génération de nombres aléatoires standard – par exemple dans un logiciel de test qui varie son approche de test en fonction d’une graine aléatoire qui lui est fournie, la solution basée sur la nanoseconde est suffisante / suffisante. Pour d’autres solutions qui peuvent nécessiter des nombres aléatoires de meilleure qualité, une solution matérielle externe peut être nécessaire.
La véritable génération de nombres aléatoires n’est pas une question simple. Il existe des solutions matérielles qui peuvent se rapprocher de, ou atteindre, une véritable entropie aléatoire et / ou une génération de nombres aléatoires. En particulier, les appareils qui ne sont pas uniquement basés sur le matériel peuvent être la clé pour générer ce nombre aléatoire parfait.