Générer des mots de passe fiables
Thierry HUET - v0.0 - 02/2023 pour APERTO-NOTA
Paramétrage du programme
[1]:
from ipywidgets import Layout, Box, IntSlider, Checkbox, Button, Output, Label
from IPython.display import display
import random, secrets, string, math
step:int = 5 # Pas du slider
maxsize:int = 100 # taille maximale du mot de passe généré
Déclaration du composant à afficher
[7]:
items_layout = Layout(width='auto')
# Déclaration du slider ---------------------------
sld = IntSlider(
value=15,
min=15,
max=maxsize,
step=step,
description='Longueur du mot de passe:',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='d'
)
# Déclaration du bouton de sélection des caractères de ponctuation
sel1 = Checkbox(
value=False,
description='Caractères ponctuation',
disabled=False,
indent=False
)
# Déclaration de la sélection des caractères spéciaux
sel2 = Checkbox(
value=False,
description='Caractères spéciaux',
disabled=False,
indent=False
)
# Déclaration du bouton de lancement du calcul
button = Button(description="Générer !", button_style="success")
# Déclaration de la case où apparaitra le résultat
resultat = Label()
# Déclaration de la case où apparaitra l'entropie
entropie = Label()
out_layout = Layout(display='flex',
flex_flow='row',
align_items='center',
border_bottom='inset',
width='50%')
res = Box(children=[resultat,entropie], layout=out_layout)
output = Output()
box_layout = Layout(display='flex',
flex_flow='column',
align_items='center',
border_bottom='inset',
width='100%')
box = Box(children=[sld,sel1,sel2, button, res, output], layout=box_layout)
[9]:
def on_button_clicked(b):
"""
Fonction chargée de calculer le mot de passe. Elle est déclenchée par un clic sur le boutton ``button``
"""
with output:
res = 0.
flag = 1
while res < 80:
seed = string.ascii_lowercase + string.ascii_uppercase
speciaux = "=+!-&#@()[]{}"
if sel1.value:
seed += string.punctuation
if sel2.value:
seed += speciaux
pwd = ''
for _ in range(0,sld.value):
pwd += secrets.choice(seed)
resultat.value = ''.join(random.sample(pwd, k=len(pwd)))
max_ent = str( round(sld.value*math.log2(len(seed)) ) )
res = round(100*len(set(resultat.value))*math.log2(len(seed)) / round(sld.value*math.log2(len(seed))))
entropie.value = str(res)+'% '+ str(flag)
flag +=1
display(box)
button.on_click(on_button_clicked)
[ ]: