Ceci est une compilation de commandes trouvées sur le site commandlinefu.com qui soit dit en passant est un très bons site pour trouver des scripts BASH tout fait.

Le but est de pouvoir générer des mots de passe complexes grâce à différentes fonctions.

Un bon moyen de comprendre le fonctionnement de chaque fonction est d’exécuter les instructions d'une méthode au fur et à mesure en la décomposant.

En utilisant la date

On calcule le MD5 grâce à la date :

date | md5sum

Pour plus de choix, on peut passer la date en nanoseconde :

date +”%N” | md5sum

Cette méthode est un peux plus complexe, car on utilise la date en seconde, avec laquelle on calcule sont SHA256 que l'on transforme en base 64 et l'on affiche que les 32 premiers caractères :

date +%s | sha256sum | base64 | head -c 32 ; echo

En utilisant la fonctionnalité /dev/urandom

Il s'agit d'utiliser une fonctionnalité intégrée au noyau Linux qui est le périphériques générateurs aléatoires du noyau.

man random (Fichiers spéciaux) - Périphériques générateurs aléatoires du noyau.
NOM : random, urandom - Périphériques générateurs aléatoires du noyau.
DESCRIPTION: Les fichiers spéciaux caractères /dev/random et /dev/urandom (existants depuis Linux 1.3.30) fournissent une interface avec le générateur de nombres aléatoires du noyau.

Le fichier /dev/random a un numéro de périphérique majeur égal à 1, et un numéro mineur égal à 8. Les numéros du périphérique /dev/urandom sont 1 pour le majeur, et 9 pour le mineur.

Le générateur de nombres aléatoires regroupe du bruit provenant de son environnement par l'intermédiaire des pilotes de périphériques et d'autres sources, et le stocke dans un réservoir d'entropie. Le générateur mémorise également une estimation du nombre de bits de bruit dans son réservoir d'entropie, et utilise son contenu pour créer des nombres aléatoires.

Lors d'une lecture, le périphérique /dev/random sera limité au nombre de bits de bruit contenus dans le réservoir d'entropie.

/dev/random est particulièrement adapté pour les cas où l'on a ponctuellement besoin de nombres hautement aléatoires (création de clés par exemple). Lorsque le réservoir d'entropie est vide, les lectures depuis le périphérique /dev/random seront bloquantes jusqu'à l'obtention de suffisamment de bruit en provenance de l'environnement.

Lors d'une lecture, /dev/urandom renverra autant d'octets qu'on en demande. Toutefois, s'il n'y a plus assez de bits disponibles dans le réservoir d'entropie, les valeurs renvoyées pourraient être théoriquement vulnérables à une cryptanalyse basée sur l'algorithme employé par le pilote. Il n'existe pas de documentation sur ce type d'attaque dans la littérature publique actuelle, mais cela n'élimine pas le risque théorique. Si ce risque est important pour votre application, utilisez plutôt /dev/random à la place.

Attention : ne pas oublier le caractère "<" devant /dev/urandom sinon cela générera une erreur "bash: /dev/urandom: Permission non accordée"

Cette méthode utilise la fonction tr pour éliminer les caractères de la fonction aléatoire qui n'appartiennent pas au groupe "_A-Z-a-z-0-9" et en affiche les 10 premiers caractères (grâce à la commande head :

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c10;echo;

ou celle ci qui affiche les 32 premiers caratères :

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;

Cette méthode reprend la fonction tr pour n'afficher que les caractères alphanumériques, sur une seul colonne de 30 caractères (grâce à la fonction fold), et affiche la première ligne (grâce à la fonction head) :

tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1

Cette méthode renvoie les 30 premiers caractères (fonction head) sous forme d'une ligne (fonction tr) de la sortie grep qui filtre les caractères alphanumériques issues de l'entrée de la fonction strings qui n'affiche que les caractères imprimables de la fonction aléatoire :

strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo

Ces 2 méthodes équivalentes permettent de créer un mot de passe de 8 caractères (fonction head) choisit parmi le motif donné à la fonction tr et qui n'est à taper qu'avec la main gauche sur un clavier QWERTY :

</dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' | head -c8; echo ""

ou avec un clavier AZERTY :

</dev/urandom tr -dc '12345&é(azertAZERTqsdfgQSDFGwxcvbWXCVB' | head -c8; echo ""

En utilisant la fonction openssl

L'option rand de la fonction openssl permet de générer un mot de passe aléatoire de 32 caractères en base64.

openssl rand -base64 32

En utilisant la fonction gpg

L'option --gen-random de la fonction gpg permet de générer un mot de passe aléatoire de 30 caractères en base64 (option --armor) avec moins ou plus de qualité (argument 0|1|2) dans l'entropie.

gpg --gen-random --armor 1 30

En utilisant le dictionnaire intégré

Ces méthodes permettent de générer un mot de passe XKCD formé des 4 mots pris dans le dictionnaire partagé de Linux.

Voici ce qu'est un mot de passe XKCD :

shuf -n4 /usr/share/dict/words | tr -d '\n'
RANGE=`wc -l /usr/share/dict/words | sed 's/^\([0-9]*\) .*$/\1/'`; for i in {1..4}; do let "N = $RANDOM % $RANGE"; sed -n -e "${N}p" /usr/share/dict/words | tr -d '\n'; done; RANGE=100; let "N = $RANDOM % $RANGE"; echo $N

En utilisant le paquet pwgen

Ce paquet est disponible dans toutes les bonne distribution ou sur le site web officiel du projet http://pwgen.sourceforge.net/

Voici comment générer 1 mot de passe de 30 caractères :

pwgen 30 1