Comment construire un générateur de mots de passe en Python ? Sur ce site, quand on s’abonne, il faut choisir un mot de passe qualifié de “fort”. Le site génère automatiquement un tel mot de passe, mais cela m’a donné une idée de programme… Regardons cela !
Je précise qu’en python, il y a un module qui génère les mots de passe (pwgen) mais comme souvent, il n’y a pas de documentation… ou très peu (par exemple, pour ce module, on voit un exemple sur cette page mais aucune liste d’options… ! Et moi, ce genre de truc me gave sévère…).
Donc autant écrire moi-même un script… On n’est jamais mieux servi que par soi-même !
Générateur de mots de passe en Python: la base
Les alphabets pour le générateur de mots de passe en Python
Pour générer un mot de passe, il faut nécessairement un alphabet. C’est un ensemble de caractères parmi lesquels nous allons choisir ceux qui vont composer le mot.
Ici, j’ai envie d’être le plus large possible; nous allons définir plusieurs alphabets :
alphabet_min = [ chr(i) for i in range(97,123) ] alphabet_maj = [ chr(i) for i in range(65,91) ] chiffres = [ chr(i) for i in range(48,58) ] caracteres_speciaux = [ '%' , '_' , '-' , '!' , '$' , '^' , '&' , '#' , '(' , ')' , '[' , ']' , '=' , '@']
- Le premier alphabet est une liste des caractères latins non accentués en minuscules;
- le deuxième est une liste des caractères latins non accentués en majuscules;
- le troisième est une liste des chiffres 0, 1, 2, …, 9 considérés comme des caractères (et non des entiers);
- le dernier est une liste des caractères spéciaux acceptés.
La fonction qui retourne un mot de passe
Je vais créer une fonction pwd(n, min, maj, chif, cs) dont les arguments sont:
- n : nombre de caractères qui composent le mot de passe souhaité;
- min : booléen qui indique si l’alphabet composé des caractères latins en minuscules est autorisé;
- maj : booléen qui indique si l’alphabet composé des caractères latins en majuscules est autorisé;
- chif : booléen qui indique si l’alphabet composé des chiffres est autorisé;
- cs : booléen qui indique si l’alphabet composé des caractères spéciaux est autorisé.
Par défaut, je vais attribuer la valeur “True” à tous les booléens.
Je vais aussi avoir besoin d’un dictionnaire nommé alphabets dont les valeurs seront les alphabets autorisés.
def pwd(n , min = True, maj = True, chif = True, cs = True): alphabets = dict() key = 0 if min: alphabets[key] = alphabet_min key += 1 if maj: alphabets[key] = alphabet_maj key += 1 if chif: alphabets[key] = chiffres key += 1 if cs: alphabets[key] = caracteres_speciaux key += 1
L’objectif est ici d’obtenir un dictionnaire de tous les alphabets autorisés.
Il y avait aussi une autre logique qui consiste à concaténer tous les alphabets en une liste… mais il a fallu faire un choix !
Maintenant, on fait une boucle itérative sur n :
mdp = '' for i in range(n): clef = randint(0,key-1) mdp += choice( alphabets[clef] ) return mdp
Pour chaque caractère du mot de passe souhaité, on choisit d’abord au hasard une clé du dictionnaire alphabets (clef = randint(0,key-1)); pour cela, on fait appel à la fonction randint du module random. Ensuite, on choisit au hasard un élément de l’alphabet correspondant (choice(alphabets[clef]) à l’aide de la fonction choice du module random, et on l’adjoint à la chaîne de caractères mdp qui représentera au final le mot de passe généré.
Le programme basique
from random import choice, randint alphabet_min = [ chr(i) for i in range(97,123) ] alphabet_maj = [ chr(i) for i in range(65,91) ] chiffres = [ chr(i) for i in range(48,58) ] caracteres_speciaux = [ '%' , '_' , '-' , '!' , '$' , '^' , '&' , '#' , '(' , ')' , '[' , ']' , '=' , '@'] def pwd(n , min = True, maj = True, chif = True, cs = True): alphabets = dict() key = 0 if min: alphabets[key] = alphabet_min key += 1 if maj: alphabets[key] = alphabet_maj key += 1 if chif: alphabets[key] = chiffres key += 1 if cs: alphabets[key] = caracteres_speciaux key += 1 mdp = '' for i in range(n): s = randint(0,key-1) mdp += choice( alphabets[s] ) return mdp
Cela donne en le lançant :
>>> pwd(20) $a(IMfb05A^9mMwXX-3k >>> pwd(50) EvprIa@Qr6^TU1EJl[I&uqo-g=1#044O[5&26o4f&$NpM3&81e
Générateur de mots de passe en Python: interface graphique
Je ne maîtrise pas du tout QT5, ni GTk. Je vais donc rester sur Tkinter, qui me semble plus abordable.
J’ai ici, comme à mon habitude, utilisé la POO (Programmation Orientée Objet): le générateur est une classe.
Vrais algorithmes générateurs de mots de passe..!