Générateur de mots de passe en Python

generateur de mots de passe en Pythnon tkinter

Générateur de mots de passe en Python

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

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.

Téléchargement du fichier

Cette partie est réservée aux abonné.e.s de ce site.
Si vous êtes abonné·e·s, merci de vous identifier pour visualiser le contenu dans son intégralité.
Stéphane Pasquet
Stéphane Pasquet

Laissez votre message