Deux recettes utilisant le module secrets (python 3.6+)
1. secrets.token_urlsafe
C'est beaucoup plus rapide que la réponse acceptée. (voir les temps ci-dessous)
import secrets
mot_de_passe = secrets.token_urlsafe(32)
Exemple de sortie :
4EPn9Z7RE3l6jtCxEy7CPhia2EnYDEkE6N1O3-WnntU
L'argument pour token_urlsafe
est le nombre d'octets. En moyenne, un octet équivaut à 1,3 caractères (encodage en base64).
2. Imposer un certain nombre de chiffres/caractères en majuscules, etc
C'est une copie légèrement modifiée de la documentation de secrets. Avec cela, vous avez un contrôle plus précis sur l'apparence des mots de passe générés. Bien sûr, ce n'est pas une option rapide si vous avez besoin de générer un grand nombre de mots de passe.
- Longueur forcée à 20 caractères
- Forcer au moins 4 caractères en minuscules
- Forcer au moins 4 caractères en majuscules
- Forcer au moins 4 chiffres
-
Des caractères spéciaux peuvent être ajoutés à l'alphabet
. Dans cet exemple, seuls -
et _
sont ajoutés.
import string
import secrets
alphabet = string.asciiletters + string.digits + '-'
while True:
mot_de_passe = ''.join(secrets.choice(alphabet) for i in range(20))
if (sum(c.islower() for c in mot_de_passe) >=4
and sum(c.isupper() for c in mot_de_passe) >=4
and sum(c.isdigit() for c in mot_de_passe) >=4):
break
Exemple de sortie :
HlxTm2fcFE54JA1I_Yp5
3. "Je n'ai pas besoin de contrôle plus précis"
Si vous privilégiez la vitesse, vous pouvez également omettre la boucle while. Dans ce cas, cela se simplifie en fait à la réponse de gerrit (mais vous perdez alors le contrôle plus précis) :
import string
import secrets
alphabet = string.ascii_letters + string.digits + '-_'
mot_de_passe = ''.join(secrets.choice(alphabet) for i in range(20))
Comparaison de vitesse
1. secrets.token_urlsafe
1.62 µs ± 96.6 ns par boucle (moyenne ± écart-type de 7 exécutions, 1000000 boucles chacune)
2. Imposer un certain nombre de chiffres/caractères en majuscules, etc
107 µs ± 11.9 µs par boucle (moyenne ± écart-type de 7 exécutions, 10000 boucles chacune)
3. "Je n'ai pas besoin de contrôle plus précis"
77.2 µs ± 9.31 µs par boucle (moyenne ± écart-type de 7 exécutions, 10000 boucles chacune)
Configuration de la comparaison de vitesse : python 3.8.5 64 bits sur Win10, 43 caractères dans chaque mot de passe (=32 octets pour token_urlsafe).