arthur.bebou

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©£G•U½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"