30/09/2024

BashLinux

Script Bash – Comment générer des nombres aléatoires sous Linux ?

I. Présentation

Dans ce tutoriel, nous allons voir comment générer et utiliser des nombres aléatoires en Bash. Nous verrons ici plusieurs exemples, outils et commandes pour réaliser cette tâche simplement.

La génération de nombres aléatoires, notamment dans une fourchette choisie, peut être utile dans de nombreux contextes comme la simulation, la création de jeux ou les applications nécessitant des données non prédictibles.

Attention, sauf indication contraire, les commandes que nous allons voir ici ne doivent pas être utilisées pour des opérations de cryptographie ou relatives à la sécurité et confidentialité. Cela, car elles n'utilisent pas une source d'entropie suffisamment sûre (non prédictible).

II. Utiliser la variable $RANDOM pour les nombres aléatoires

La variable d’environnement "$RANDOM" est une variable intégrée dans Bash qui génère un nombre aléatoire à chaque fois qu'elle est appelée, voyez plutôt :

Génération de nombres aléatoires en Bash grâce à  la vriable "$RANDOM".
Génération de nombres aléatoires en Bash grâce à la vriable "$RANDOM".

Nous pouvons obtenir un nombre aléatoire en faisant un simple “echo” de la variable, ou en l’assignant à une autre variable pour l’utiliser plus tard :

# Générer un nombre aléatoire
echo $RANDOM

# Assigner un nombre aléatoire à une variable
nombre_aleatoire=$RANDOM

La limite d’utilisation de cette variable est que le nombre retourné est forcément compris entre 0 et 32767, ce qui peut ne pas coller à tous les contextes. Nous pouvons néanmoins réduire cette fourchette via quelques opérations mathématiques simples.

Voici un exemple pour obtenir un nombre entre 10 et 100 :

# Générer un nombre aléatoire entre 10 et 100
echo $((10 + RANDOM % 90))

Nous utilisons ici une addition pour le seuil minimum et un modulo pour le seuil maximum. L’intérêt du modulo étant qu’il retourne le reste d’une division, qui ne peut excéder le dénominateur, il faut donc lui soustraire notre seuil minimum. Si l’on tient à utiliser “$RANDOM” pour générer des nombres aléatoires supérieurs à 32767, il suffit d’utiliser à nouveau l’addition :

# Générer un nombre aléatoire entre 0 et 65534
echo $((RANDOM +  RANDOM))

La variable d’environnement "$RANDOM" est parfaite pour être intégrée rapidement à des scripts Bash. Cependant, son utilisation peut paraître quelque peu artisanale lorsque l’on veut contrôler strictement la fourchette dans laquelle doit se trouver le nombre aléatoire.

III. Générer des nombres aléatoires avec shuf

Nous pouvons également utiliser la commande "shuf" afin de générer des nombres aléatoires facilement et rapidement en Bash. Celle-ci permet de rapidement définir la fourchette dans laquelle doit se trouver notre nombre aléatoire.

Voici comment utiliser simplement la commande "shuf" :

# Générer un nombre aléatoire entre 1 et 100
shuf -i 1-100 -n 1

L’option "-i" est ici utilisée pour indiquer la fourchette dans laquelle doit se trouver notre nombre aléatoire. L’option “-n 1” permet d’indiquer que l’on veut en retour un seul nombre. On pourrait tout à fait lui demander de nous retourner 3, 10 ou 100 nombres aléatoires :

# Générer dix nombres aléatoires entre 1 et 100
shuf -i 1-100 -n 10

IV. Utilisation de /dev/random et /dev/urandom

Linux propose deux dispositifs de génération de nombres aléatoires : "/dev/random" et "/dev/urandom. Il s’agit de fichiers périphériques un peu spéciaux pouvant être utilisés comme CSPRNG (cryptographically secure pseudorandom number generator) :

  • /dev/random : fournis des nombres aléatoires de haute qualité en collectant de l'entropie à partir des mouvements de la souris, des frappes au clavier, et d'autres sources aléatoires. Sur les anciennes versions du Kernel Linux, il pouvait se bloquer si l'entropie disponible était insuffisante, cela afin de garantir un niveau minimum de sécurité. Ce n’est plus le cas sur les versions récentes (source).
  • /dev/urandom : utilise le même pool d'entropie que "/dev/random", mais ne se bloque jamais. Il continue de fournir des nombres aléatoires même si l'entropie est faible, ce qui le rend plus rapide et généralement suffisant pour la plupart des usages.

L'utilisation de ces deux fichiers pour des applications cryptographiques est un sujet de débat parmi les experts en sécurité. Le fait est que "/dev/random" se bloque si l’entropie générée n’est pas suffisante, alors que "/dev/urandom" ne se bloque pas, mais bascule sur une méthode de génération de nombre aléatoire pouvant dans certains contextes être mal initialisé. Ces deux éléments posent question concernant la prédictibilité des nombres générés ou la fiabilité pour un usage par d’autres applications impliquant des besoins élevés de sécurité.

Vous pouvez donc utiliser ces méthodes de génération de nombres aléatoires pour des besoins et applications non critiques. Mais, préférez utiliser des générateurs de nombres aléatoires spécialement conçus pour la cryptographie, telles que des bibliothèques cryptographiques comme "openssl" ou "libsodium", voir un HSM (Hardware Security Module) pour les applications nécessitant un haut niveau de sécurité et de confidentialité.

Voici comment utiliser "/dev/random" ou "/dev/urandom" pour la génération de nombres aléatoires :

# Utiliser /dev/random pour générer des nombres aléatoires
head -c 2 /dev/urandom | od -An -tu4

# Utiliser /dev/urandom pour générer des nombres aléatoires
head -c 2 /dev/urandom | od -An -tu4

Cette commande combine deux outils Unix pour générer et afficher un nombre aléatoire de 32 bits. La première partie, "head -c 4 /dev/urandom", lit les 4 premiers octets (32 bits) de "/dev/urandom". Ensuite, le caractère pipe "|" redirige la sortie de cette commande comme entrée de la commande suivante. La commande "od" (octal dump) affiche les données en différents formats, avec l'option "-An", elle supprime l'affichage des adresses, et avec "-tu4, elle spécifie que la sortie doit être affichée en format décimal non signé de 4 octets (32 bits).

V. Un mot sur l'entropie

L'entropie est une mesure du désordre ou de l'imprévisibilité dans un système. En matière de génération de nombres aléatoires, plus l'entropie est élevée, plus les nombres générés sont imprévisibles et sécurisés.

Pourquoi est-ce important ?

Dans les contextes où les besoins de sécurité sont élevés, comme la cryptographie, il est nécessaire d'utiliser des sources de nombres aléatoires avec une entropie élevée pour éviter que des attaquants ne prédisent les valeurs générées. C'est pourquoi il est important d’utiliser les bons outils, et donc de connaître leur fonctionnement pour savoir s’ils répondent ou non à nos exigences de sécurité.

VI. Conclusion

La génération de nombres aléatoires est une tâche courante en programmation Bash, utile dans divers contextes, allant des scripts simples aux applications nécessitant une sécurité renforcée. En comprenant les différentes méthodes disponibles et leur adéquation selon les besoins, vous pouvez choisir la solution la plus appropriée pour vos projets.

N'oubliez pas que pour des besoins de sécurité, des outils spécialisés sont préférables, tandis que pour des besoins non sécuritaires, "$RANDOM" et "shuf" sont largement suffisants.

author avatar
Mickael Dorigny Co-founder
Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.