Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (5430B)
1 #! page 2 title: mdpgen 3 author: Arthur Pons 4 description: Un générateur simpliste de mots de passe 5 publication: 2024-12-07 6 7 sectionmd: main 8 9 Il y a quelques années j'avais fait [une 10 présentation](https://pod.unistra.fr/video/23983-techdays-6-quest-ce-qui-fait-un-bon-mot-de-passe-arthur-pons/) 11 expliquant ce qui fait la qualité d'un mot de passe. L'idée était de rendre 12 intuitif les caractéristiques jouant dans la qualité d'un mot de passe pour 13 arriver naturellement à la conclusion qu'une phrase de passe suffisament longue 14 est un bon mot de passe. 15 16 Dans les cas où la mémorabilité n'est pas primordiale parce qu'il est 17 acceptable de noter de mot de passe en clair sur du papier ou un support 18 numérique, il est utile de tout de même conserver une autre caractéristique, la 19 capacité à le prononcer. Cela rend plus facile la dictée de mot de passe, 20 situation dans laquelle je suppose que la plus part d'entre nous nous sommes 21 déjà trouvé·es. C'est, je crois, la solution retenue par Free pour ses mots de 22 passe wifi. On obtient alors des mots comme : 23 24 varuqa-sodila-lijusa-ronifu-tijipa 25 26 Construisons un petit outil, en shell évidemment, qui permet de générer ce 27 genre de mots de passe. 28 29 Première considération, comment récupérer de l'aléatoire ? Sur la plupart des 30 Unix[^1] il existe un fichier nommé 31 [/dev/random](https://en.wikipedia.org/wiki//dev/random)[^2] qui génère du 32 contenu aléatoire. En regardant dedans on trouve ce qui semble être n'importe 33 quoi : 34 35 $ cat /dev/random | head -n1 36 W½âcpF f©£GU½m } »ÕpËHvÏzª¥mØ)ÿ;I/¿2ÁòI=ÊCÎöH8æ×ÝÞOÈ 37 38 Les bits aléatoires générés par /dev/random peuvent être interprétés comme du 39 texte (ce que l'on voit juste au dessus) et donc théoriquement contenir 40 n'importe quel caractère unicode. On peut donc obtenir les lettres de 41 l'alphabet latin si l'on supprime le reste. Pour cela on peut utiliser `tr` 42 avec les options de supression et de complément : 43 44 $ cat /dev/random | tr -d -c 'a-z\n' | head -n1 45 geizzddenofkdznznsknnsshhfibrkoolmwiywmoloxtoteyrptafichgzlrxniweixtczwyawajatgygsrigatwmaosgfjlelinhkrnirysdq 46 47 Ici on demande à `tr` de tout supprimer *sauf* les lettres de `a` à `z` et les 48 retour à la ligne. On termine le programme avec `head` en ne retenant que la 49 première ligne.[^3] En imaginant que l'on souhaite créer des groupes de trois 50 syllabes ne gardons que qui nous intéressent : 51 52 $ cat /dev/random | tr -d -c 'a-z\n' | head -n2000 | grep -Eo '([rtjqlmpdfvsn][aiou]){3}' 53 dirosu 54 dupuvo 55 qimuqu 56 qufaro 57 [...] 58 59 La commande `grep` nous permet de ne conserver que des suites de syllabes. J'ai 60 fait le choix de retirer certaines consonnes et voyelles dont les 61 prononciations sont trop ambigues. Au prix d'un peu de recherche je suppose 62 qu'il est possible de vérifier la liste des syllabes aux prononciations non 63 ambigues en français et de ne sélectionner que celles-ci mais j'ai la flemme. 64 Il faut également grandement agrandir le nombre de ligne que l'on récupère 65 (l'optin `-n` de `head`) pour garantir d'avoir[^4] assez de données pour 66 générer au moins un triplet de syllabe convenable. 67 68 A partir de là on peut créer des groupes de triplets avec paste. Pour créer 69 des groupes de cinq : 70 71 72 $ cat /dev/random | tr -d -c 'a-z\n' | head -n2000 | grep -Eo '([rtjqlmpdfvsn][aiou]){3}' | 73 head -n5 | paste - - - - - -d'-' 74 ripupo-tudiqo-lanoti-niludi-lovila 75 76 Voilà notre mot de passe ! Et si l'on voulait modifier la commande pour qu'elle puisse en 77 générer autant que l'on souhaite on pourrait adapter le nombre de lignes filtrées dans les 78 deux `head` avec une variable : 79 80 $ cat /dev/random | 81 tr -d -c 'a-z\n' | 82 head -c $((2000*$nb)) | 83 grep -Eo '([rtjqlmpdfvsn][aiou]){3}' | 84 head -n$((5*$nb)) | 85 paste - - - - - -d'-' 86 87 Modifier le nombre de groupes de syllabes de cinq vers autre chose pourrait se 88 faire en pré-générant les arguments passés à `paste` et en ajustant de nombre 89 de groupes récupérés par le seconde `head` : 90 91 92 $ pastearg=$(yes '-' | head -n$len | paste -s -d' ') 93 cat /dev/random | 94 tr -d -c 'a-z\n' | 95 head -c $((2000*$nb)) | 96 grep -Eo '([rtjqlmpdfvsn][aiou]){3}' | 97 head -n$(($len*$nb)) | 98 paste $pastearg -d'-' 99 100 Ce code embarqué dans un script est dans le dépôt git 101 http://git.bebou.netlib.re/mdpgen/log.html. 102 103 Et la sécurité dans tout ça ? Avec les syllabes retenues dans ce code la taille 104 de notre alphabet est de 12*4 = 48. Pour avoir une entropie équivalente à une 105 phrase de passe diceware de sept mots il faut au moins 17 syllabes donc six 106 groupes de trois syllabes. Selon le modèle de menace cinq groupes peut être 107 suffisant. 108 109 diceware 7 mots: 7776^7 110 1720618914350498356204193953 111 mdpgen 5 goupes: 48^(5*3) 112 16543163447903718821855232 113 mdpgen 6 goupes: 48^(6*3) 114 1829541532030568071946613817344 115 116 117 [^1]: mais attention, je ne sais pas à quel point c'est portable pour autant 118 [^2]: j'utilise /dev/random non pas parce que je pense que c'est plus sécurisé 119 mais parce que je crois bien que c'est + portable. 120 [^3]: On pourrait demander à `tr` de supprimer aussi les retour à la ligne 121 et de terminer le pipe avec un `head -c` plutôt qu'un `head -n` mais à 122 l'usage j'ai remarqué que c'était plus lent. 123 [^4]: ou plutôt "rendre très improbable de ne pas avoir"