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)
[ ]: