[PYTHON] Notes de création du générateur de mots de passe

Cadre avant

Je voulais rechercher et développer quelque chose moi-même, et j'étais intéressé par la génération de mots de passe depuis longtemps, alors j'ai décidé de le faire.

Puisque Python est une histoire courte, j'aimerais le faire facilement en utilisant la bibliothèque Python. Veuillez noter que le code est sale car je suis un amateur en matière de développement.

Exigences à viser

«Je veux d'abord en faire une classe, et enfin une application web.

Tout d'abord, renseignez-vous sur les nombres aléatoires

En tant que prémisse majeure du mot de passe, ** quelque chose qui ne peut être deviné par les autres ** est recommandé, il est donc important de savoir comment sélectionner les caractères. Par conséquent, nous avons besoin d'un mécanisme pour sélectionner des personnages au hasard.

Python a un module aléatoire. https://docs.python.org/ja/3/library/random.html#module-random

Cependant, comme indiqué dans le document officiel ci-dessus, il ne dérive qu'une valeur quelque peu aléatoire qui peut être logiquement reproduite / devinée et ne convient pas à des fins de sécurité.

Par conséquent, il est recommandé de l'utiliser à des fins de sécurité, le module secrets basé sur la source de nombres aléatoires fournie par le système d'exploitation. https://docs.python.org/ja/3/library/secrets.html#module-secrets Ça y est. C'est bon.

De plus, si vous regardez de plus près, vous trouverez des recettes et des bonnes pratiques.

Pour générer un mot de passe à 10 caractères composé d'alphavets et de chiffres, comprenant au moins une lettre minuscule et au moins trois chiffres:

generate_password_best_practice.py


import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
    password = ''.join(secrets.choice(alphabet) for i in range(10))
    if (any(c.islower() for c in password)
            and any(c.isupper() for c in password)
            and sum(c.isdigit() for c in password) >= 3):
        break

Jouons avec ça.

Faites-en une fonction

Prenez la longueur du mot de passe comme argument

generate_random.py


import string
import secrets

alphabet = string.ascii_letters + string.digits

def password_generater(password_length):
    while True:
        password = ''.join(secrets.choice(alphabet) for i in range(password_length))
        if (any(c.islower() for c in password) and any(c.isupper() for c in password) and sum(c.isdigit() for c in password) >= 3):
           break
    return password

main.py


import generate_random 

#La longueur du mot de passe peut être spécifiée par argument
result = generate_random.password_generater(16)

print(result)

Quand je l'exécute

7g29HnFJItLJoiB7

Ouais, ça fait du bien.

Prenez le nombre minimum d'occurrences de chaque caractère comme argument

generate_random.py


import string
import secrets

alphabet = string.ascii_letters + string.digits

def password_generater(password_length, lower_letters_min=0, upper_letters_min=0, digit_min=0):
    while True:
        password = ''.join(secrets.choice(alphabet) for i in range(password_length))
        if (sum(c.islower() for c in password) >= lower_letters_min and sum(c.isupper() for c in password) >= upper_letters_min  and sum(c.isdigit() for c in password) >= digit_min):
           break
    return password

Comme il est défini sur 0 par défaut, il est généré une fois, sauf indication contraire.

Quand je l'exécute

zmoIBPQVU8MI3tJL

Il semble que la condition selon laquelle "au moins trois nombres apparaissent" dans la recette officielle a certainement disparu.

Essayez de lister les arguments

Après avoir essayé jusqu'à présent, j'ai eu l'idée qu'il serait pratique de dresser une liste du nombre d'occurrences, par exemple "Je veux spécifier uniquement le nombre minimum d'alphabets en majuscules!".

(Actuellement en construction)

Recommended Posts

Notes de création du générateur de mots de passe
Générateur de mots de passe à motifs
Générateur de mot de passe de hachage
Générateur
Générateur