Générer un mot de passe

Générer un mot de passe en shell UNIX

Problématique

Il peut être parfois utile de générer un mot de passe dans un shell sans pour autant installer de programmes spécifiques comme mkpasswd, etc.

Par exemple, dans une application (web ou locale) générer un mot de passe par défaut, pour un utilisateur ou un programme. Un mot de passe efficace.

Solution

Étape par étape

Il existe un générateur de données aléatoires :

dd if=/dev/urandom count=1

Remarque

Il existe aussi le pseudo périphérique /dev/urandom pour générer des données aléatoires.

Cette commande va générer 512 octets aléatoires. Mais ce générateur ne s'occupe pas de savoir si les données générées sont accessibles par un clavier et donc utilisables.

Pour améliorer ces données aléatoires et les rendre utilisables, il faut donc les transformer.

dd if=/dev/urandom count=1 | uuencode -m -

ou, pour ceux qui n'ont pas uuencode installé, une transformation en base64 :

dd if=/dev/urandom count=1 | openssl base64

par exemple, donnera :

1+0 records in
1+0 records out
512 bytes transferred in 0.000346 secs (1480003 bytes/sec)
begin-base64 644 -
uoTo/5c2cv2lR5WP7FPxuAUS99HKYkcxzjRL8wKpwApdNJXp+ja4gGk1PD/4O1kckv4qO8FpXlhN
ymTIDqAxSLIUfusI1bwcif2lTAIzzgrsC4PA4Be5DfC9Xeg+rKZuXLIFFjPoiOAvgEngADq+/VG+
prb1wdM/hCEgqAQv5vtDoHbESXtwrKkivU5+GNjMcDg/oPOu71ppq6h+ej+CFx4zLa2WlOYhMKP2
SgtxdBo7CxK/87AV7jgiv6TXHc+gedEHFxptsbRcVjAl4zbLstCXqL9DAQm9XDtiu0qI4F0Qsz6Q
YIceRebIFo5VsBdKKsMsm6Cp+QOZ+snhGZXh2iBB2h3iQ7IUbdp/ylbpw6/znHAf7F0S3FZO/5nd
Xrv87S2X/HjJE8JXty8tWCDKU1pOZiy94SeREXgolsNs7yy4cwjFpDrmkLwxskuUwA9LScOJD+XG
6DiuixTaq7Xsw8FciTnSkwIRFMsohmDRYlBRadBA5rTTF/E7KKzNjNNkPA7UOgNM39pOlvR+QacK
c6G4JiQrfJaPhlkc78RzGhGTd+DrtUstPv0dyUVIRSw4UDhcN2eSuSEFzqncGeoXFTDYeaN8PTpy
5Zof72Jq8iAa4Z3b0+h3AtvjwCTf/ueDtnKUX/eCpKolay2dxcTRyhqpVg/iYAqAuT/D7PsbX9A=
====

C'est long, mais plus aisément utilisable. Il suffit ensuite d'éliminer les lignes inutiles, de tronquer pour ne prendre que quelques caractères. Par exemple :

dd if=/dev/urandom count=1 | uuencode -m - | head -n 2 | tail -n 1 | cut -c-12

ou passer par la suppression des sauts de ligne:

dd if=/dev/urandom count=1 | uuencode -m - | tr -d '\n' | cut -c-12

va générer un mot de passe de 12 caractères de long.

Pour supprimer éventuellement , les + et les /, il suffit d'ajouter un sed :

dd if=/dev/urandom count=1 | uuencode -m - | sed 's/+//g' | sed 's/\///g' \
| head -n 2 | tail -n 1 | cut -c-12

ce qui va donner, par exemple :

Y5fCwMPoeyEt

Variantes et améliorations

De la même façon, il est possible de produire des résultats similaires en changeant un peu la méthode.

< /dev/urandom tr -dc A-Za-z0-9 | head -c12; echo

L'option -c permet de prendre la négative de -d, soit de ne garder qu'une chaîne de caractères ne contenant que ceux précisés dans la liste qui suit.

Ou encore, plus finement :

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

Si nous voulions paramétrer la génération, ceci donnerait :

< /dev/urandom tr -dc A-Za-z0-9 | head -cs{1:-12}; echo

Il n'y aurait plus qu'à créer une fonction et lui passer la longueur en paramètre.

openssl possède une méthode pour générer des chaînes aléatoires. Il peut ainsi servir de la façon suivante :

openssl rand -base64 12

qui générera alors un mot de passe aléatoire de 12 caractères, que nous pourrions également paramétrer et transformer en fonction.

Pour aller plus loin

De la même façon, on peut générer des nombres aléatoires