Pour générer une chaîne aléatoire (par exemple, mots de passe, noms d'utilisateur, etc.), il est possible d'utiliser les outils dtandards fournis par les systèmes Linux/Unix.
Pour des raisons de sécurité et de confidentialité, il est préférable que les chaînes soient générées hors ligne, plutôt qu'en ligne sur un site Web.)
La commande APG inclus par défaut sur certaines distributions Linux, permet de générer aléatoirement des mots de passe.
Par exemple pour générer des mots de passe de taille 5 à 10 dans les sous-ensembles Special (caractères spéciaux), Numeric, Capital (majuscules) et Lower (minuscules), la commande:
apg -MSNCL -m 5 -x 10
retourne
@OpVeyhym9 3:Glul 3DroomIc? hed&Os0 NefIj%Ob3 35Quok}
La philosophie Unix de fournir «de nombreux petits outils qui font bien une chose» sert très bien dans ce cas.
La commande suivante, donne 57 caractères possibles:
base64 </dev/urandom | tr -d 'O0Il1 + /' | head -c 44; printf '\ n'
La commande xxd (convertit une entrée binaire en représentation hexadécimale et inversement) permet de spécifier la longueur de la chaîne désirée avec l'option -l
xxd -l16 -ps /dev/urandom
On peut utiliser /dev/urandom avec tr pour supprimer les caractères indésirables. Par exemple, pour obtenir uniquement des chiffres et des lettres:
tr -dc A-Za-z0-9 </dev/urandom | head -c 13 ; echo ''
Sinon, pour inclure plus de caractères de la liste des caractères spéciaux du mot de passe OWASP:
tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
Pour résoudre les problèmes rencontrés avec le language par défaut, ajouter LC_ALL=C comme ceci:
LC_ALL=C tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
Pour obtenir plus 100 octets avec /dev/urandom on peut utiliser dd pour copier l'entrée en sortie en appliquant les modificateurs donnés en arguments (qui peuvent inclure la taille et le nombre de blocs)
base64 -w0 </dev/urandom | dd bs=1k count=1
Lorsqu'on a besoin d'un sous-ensemble de caractères, on peut insérer un modificateur dans le tube.
Ex: tr -d '[A-Z / +]' pour se débarrasser des majuscules et + et
- On peut définir le bs (taille de bloc) sur la longueur dont vous avez besoin.
Sous Linux, base64 encapsule à 76 colonnes par défaut et doit être réinitialisé avec -w0 sauf si on le souhaite.
tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2> /dev/null
Le 2> /dev/null à la fin de la commande dd sert à supprimer la sortie “… enregistrements dans / … enregistrements sortants”.
En cas de problème de l'entrée due à la langue par défaut ajouter LC_ALL=C à la commande:
LC\_ALL=C tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2> /dev/null
Pour génèrer une chaîne aléatoire de 10 caractères on utilise une liste de caractères codée en dur:
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
Cette solution n'est pas une pratique de programmation encouragée en raison de la lisibilité, de la compacité et de la propreté du code. De plus, certains des caractères ASCII imprimables spéciaux pourraient être interprétés par bash, sans parler de l'inconvénient le plus évident de sa seule doublure.
Pour générer un mot de passe avec la plus grande entropie possible on peut utiliser les classes de caractères prédéfines dans les expressions régulières
Certaines classes de caractères nommées sont prédéfinies dans des expressions entre crochets, comme suit. Leur interprétation dépend de la locale LC_CTYPE; par exemple, [:alnum:]
désigne la classe de caractères des nombres et des lettres dans la langue actuelle.
Classe | Signification |
---|---|
[:alnum:] | Caractères alphanumériques: «[:alpha:]» et «[:digit:]»; dans les paramètres régionaux «C» et le codage de caractères ASCII, c'est la même chose que «[0-9A-Za-z]». |
[:alpha:] | Caractères alphabétiques: «[:lower:]» et «[:upper:]»; dans les paramètres régionaux «C» et le codage de caractères ASCII, c'est la même chose que «[A-Za-z]». |
[:blank:] | Caractères vides: espace et tabulation. |
[:Cntrl:] | Caractères de contrôle. En ASCII, ces caractères ont les codes octaux 000 à 037 et 177 (DEL). Dans d'autres jeux de caractères, ce sont les caractères équivalents, le cas échéant. |
[:digit:] | Chiffres: 0 1 2 3 4 5 6 7 8 9. |
[:graph:] | Caractères graphiques: «[:alnum:]» et «[:punct:]». |
[:lower:] | Minuscules; dans les paramètres régionaux «C» et le codage de caractères ASCII, il s’agit de a b c d e f g h i j k l m n o p q r s t u v w x y z . |
[:print:] | Caractères imprimables: «[:alnum:]», «[:punct:]» et espace. |
[:punct:] | Caractères de ponctuation; dans la locale «C» et le codage de caractères ASCII, il s'agit de ! "# $% & '() * +, -. /:; <=>? @ [\] ^ _ {|} ~. |
[:space:] | Caractères d'espacement: dans les paramètres régionaux «C», il s'agit de tabulation, nouvelle ligne, tabulation verticale, saut de page, retour chariot et espace. |
[:upper:] | Lettres majuscules: dans les paramètres régionaux «C» et le codage de caractères ASCII, il s'agit de A B C D E F G H I J K L M N O P Q R S T U V W X Y Z . |
[:xdigit:] | Chiffres hexadécimaux: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f . |
La commande suivante génère une chaîne en utilisant tous les caractères imprimables ASCII - de 32 (espace) à 126 (tilde, ~). La longueur du mot de passe peut être contrôlée avec l'indicateur -c de head.
< /dev/urandom tr -cd "[:print:]" | head -c 32; echo
Pour ne pas inclure l'espace, juste les caractères 33-126, utiliser [:graph:]
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32
La commande suivante génère une chaîne en utilisant tous les caractères alphanumériques:
cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -13 b0R55751vWW9V
Pour configurer la longueur du mot de passe, remplacer le nombre dans la commande cut par la longueur dont vous avez besoin, par exemple 24 caractères
cat /dev/urandom | base64 | head -n 1 | tr -dc '[:alnum:]' | cut -c -24 WFBhVHuKbrnRhd5kdWXPzmZG
Si on ne veut pas confondre 0 ou O, 1 ou l, on peut filtrer avec un autre tr
cat /dev/urandom | base64 | head -n 1| tr -dc '[:alnum:]' | tr -d '0O1l' | cut -c -24 JuCphwvhrhppD9wVqfpP2beG
Pour un mot de passe très sécurisé (où 16 est la longueur pw):
cat /dev/urandom | tr -cd [:graph:]|head -c 16
Exemple de résultat:
jT@s_Nx]gH<wL~W}
Ou bien, pour générer plusieurs mots de passe:
cat /dev/urandom | tr -cd [:graph:]|fold -w 16|head -6
Exemple de résultat:
7ck%G7'|f&}_8(]s <?*]E.CG[NB'gK#A :tF-WPTOa3!i7S(h 2xy(>=%3=Kb1B$`6 *98Lf{d?Jzb}6q1\ E7uCEAN2Hz]]y|5*
Un peu moins sécurisé (jeu de caractères plus petit):
cat /dev/urandom | base64 -w 0 | fold -w 16 | head -6
Exemple de résultat:
rJqYxYZLOTV+A45w PUKQ+BoBf6yfZw5m +LRfpsN9CsLRiN8V yMS6zDpL6NHmG17s yTUWPG7Rum97schi cognvjVwaKaAyPRK
On peut utiliser l'un des outils md5 qui a précisément cet objectif. Dans le cas de la création d'un mot de passe complètement aléatoire, on peut utiliser le md5pass. C'est un outil très simple à utiliser et très utile, car on peut utiliser le “texte normal” avec un “sel” pour créer un bit de saut du même mot de passe que l'on peut récupérer par la suite, ou on peut également obtenir un complètement mot de passe aléatoire tout le temps. L'utilisation générale est:
md5pass [mot-de-passe] [sel]
où mot-de-passe est un mot choisi qui sera utilisé pour la construction de la chaîne aléatoire et sel est le salt d'octets à utiliser. Comme ça:
md5pass mot-de-passe $1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0
Cela créera un mot de passe “une séquence aléatoire” que l'on utilisera. Si on ne définit pas de sel, on ne pourra peut-être pas recréer cette même chaîne par la suite.
Cependant, si on spécifie un sel comme celui-ci:
md5pass mot-de-passe 512 $1$512$.0jcLPQ83jgszaPT8xzds0
alors on peut créer une séquence que l'on peut récupérer si on utilise le mot-de-passe en conjonction avec le même sel (ou salt) s'il a été défini à l'origine.
Selon le niveau de caractère aléatoire que l'on souhaite, on peut simplement utiliser la variable intégrée $RANDOM de bash (également zsh et ksh, éventuellement d'autres):
echo $RANDOM | tr '[0-9]' '[a-z]' bfeci echo $RANDOM | tr '[0-9]' '[a-z]' cijjj
Les méthodes lisant directement à partir de /dev/urandom sont beaucoup plus simples, mais par souci de complétion, on peut également utiliser $RANDOM:
echo $(for((i=1;i<=13;i++)); do printf '%s' "${RANDOM:0:1}"; done) | tr '[0-9]' '[a-z]'
Important: cette solution ne produira que des chaînes aléatoires en utilisant les 10 premieres lettres de l'alphabet.
La commande shuf génère des permutations aléatoires entre les lignes d'entrée et la sortie standard. Si on lui donne un fichier ou une série de fichiers, il mélangera les lignes et écrira le résultat sur la sortie standard.
shuf fait partie de linux coreutils et est largement disponibleInspiré par Pablo Repetto, je me suis retrouvé avec cette solution facile à retenir:
shuf -zer -n20 {A..Z} {a..z} {0..9}
Le problème ici est “-z” car il “n'évite pas la sortie multi-lignes” mais ajoute un \0 au lieu d'une nouvelle ligne à chaque chaîne (visible en ajoutant | od -xc
). on peut supprimer les caractères zéro avec tr: shuf -zer -n20 {A..Z} {a..z} {0..9} | tr -d '\0'
Les deux commandes suivantes génèrent respectivement des mots de passe et des phrases de passe aléatoires:
shuf --random-source=/dev/urandom --repeat --head-count=20 file_with_characters | tr --delete '\n' shuf --random-source=/dev/urandom --repeat --head-count=7 file_with_words | tr '\n' ' '
file_with_characters
contenant tous les caractères que l'on souhaite utiliser pour le mot de passe, un caractère par ligne et exactement une fois chacun. Le fichier ne doit pas contenir de lignes vides et les lignes doivent être terminées par une nouvelle ligne.file_with_words
contenant tous les mots que la phrase de passe utilise, un mot par ligne et exactement une fois chacun. Le fichier ne doit pas contenir de lignes vides et les lignes doivent être terminées par une nouvelle ligne.openssl rand -base64 12
ou
openssl rand -hex 12
rand -hex limitera la sortie à seulement 16 caractères, plutôt que les 90+ du clavier. base64 est meilleur car il contient 64 caractères, mais ce n'est pas aléatoire (par exemple, il existe des motifs de remplissage prévisibles, et peut-être que certains caractères apparaissent plus souvent que d'autres
pwgen génère des mots de passe aléatoires, sans signification mais prononcables. Ces mots de passe contiennent soit uniquement des lettres minuscules, soit des majuscules et des minuscules mélangées, soit des chiffres ajoutés. Les lettres majuscules et les chiffres sont placés de manière à faciliter la mémorisation de leur position lors de la mémorisation du mot uniquement.
Par exemple pour générer 7 mots de passe de longueur 13:
pwgen 13 7 Eu7Teadiphaec giepahl3Oyaiy iecoo9Aetaib4 phaiChae6Eivi athoo3igee8Co Iphu4ufeDeelo aesoYi2lie9he
Pour améliorer l'entropie on peut utiliser l'argument -s (c'est-à-dire générer des mots de passe plus sûrs, complètement aléatoires mais difficiles à retenir):
pwgen -s 13 7 eAfycrPlM4cYv 4MRXmZmyIVNBp D8y71iqjG7Zq7 FQRHcserl4R8O yRCUtPtV3dsqV 0vJpp2h0OrgF1 QTp7MKtJyTrjz
Ce package génère des mots de passe prononçables. Il utilise les statistiques des combinaisons de trois lettres (trigraphes) tirées de tous les dictionnaires que l'on alimente.
Par exemple pour générer 7 mots de passe (noms d'utilisateur) de longueur 13:
gpw 7 13 sreepoidahsas risadiestinge ntodynesssine décourager natinglumperm riasigentspir enderiferback