diff --git a/débutscriptmotdepasse.ps1 b/débutscriptmotdepasse.ps1 index fe54d57..2a14055 100644 --- a/débutscriptmotdepasse.ps1 +++ b/débutscriptmotdepasse.ps1 @@ -1,67 +1,66 @@ import pandas as pd -import random +import secrets # Plus sécurisé que 'random' pour les mots de passe import string -def generate_password(): +def generate_robust_password(length=12): """ - Génère un mot de passe aléatoire de 8 caractères contenant : - - Au moins 1 majuscule - - Au moins 1 minuscule - - Au moins 1 chiffre - - Au moins 1 caractère spécial + Génère un mot de passe fort de 12 caractères. + - Utilise le module 'secrets' (cryptographiquement sûr). + - Exclut les caractères ambigus (I, l, 1, O, 0) pour éviter les erreurs de lecture. + - Garantit au moins 1 Maj, 1 Min, 1 Chiffre, 1 Spécial. """ - # Définition des jeux de caractères - upper = string.ascii_uppercase - lower = string.ascii_lowercase - digits = string.digits - special = string.punctuation + # 1. Définition des caractères (sans les ambigus) + # On retire I, l, O du jeu de lettres + letters = string.ascii_letters.replace('I', '').replace('l', '').replace('O', '') + # On retire 1 et 0 du jeu de chiffres + digits = string.digits.replace('1', '').replace('0', '') + special = "!@#$%&*+-=?" # Liste de symboles sûrs pour AD - # On s'assure d'avoir au moins un caractère de chaque type - password = [ - random.choice(upper), - random.choice(lower), - random.choice(digits), - random.choice(special) - ] + alphabet = letters + digits + special - # On complète les 4 caractères restants avec un mélange de tous les types - all_chars = upper + lower + digits + special - password += [random.choice(all_chars) for _ in range(4)] - - # On mélange les caractères pour que l'ordre soit aléatoire - random.shuffle(password) - - # On convertit la liste en chaîne de caractères - return "".join(password) + while True: + # On pioche aléatoirement + password = ''.join(secrets.choice(alphabet) for _ in range(length)) + + # On vérifie si les conditions de complexité sont remplies + if (any(c.islower() for c in password) + and any(c.isupper() for c in password) + and any(c in digits for c in password) + and any(c in special for c in password)): + return password def main(): + # --- CONFIGURATION --- input_file = "Projet 01 - happy_koalas_employees.csv" output_file = "happy_koalas_employees_with_passwords.csv" + # --------------------- try: - # Lecture du fichier CSV (séparateur point-virgule) - print(f"Lecture du fichier {input_file}...") + print(f"--- Début du traitement ---") + print(f"Lecture de : {input_file}") + + # Lecture du CSV (gestion des séparateurs) df = pd.read_csv(input_file, sep=";") - - # Nettoyage des colonnes vides éventuelles + + # Nettoyage des colonnes vides (fréquent avec les conversions Excel) df = df.dropna(axis=1, how='all') - # Génération des mots de passe pour chaque ligne - print("Génération des mots de passe...") - df['Password'] = df.apply(lambda x: generate_password(), axis=1) + print("Génération des mots de passe sécurisés...") + # Application de la fonction + df['Password'] = df.apply(lambda x: generate_robust_password(), axis=1) - # Sauvegarde dans un nouveau fichier + # Sauvegarde df.to_csv(output_file, sep=';', index=False) - print(f"Succès ! Le fichier a été sauvegardé sous : {output_file}") + print(f"✅ SUCCÈS : Fichier sauvegardé sous '{output_file}'") - # Affichage d'un aperçu - print("\nAperçu des 5 premiers utilisateurs :") - print(df[['FirstName', 'LastName', 'Password']].head()) + # Aperçu + print("\n--- Aperçu des 3 premiers comptes ---") + print(df[['UserName', 'Password']].head(3).to_string(index=False)) except FileNotFoundError: - print(f"Erreur : Le fichier '{input_file}' est introuvable.") + print(f"❌ ERREUR : Le fichier '{input_file}' n'a pas été trouvé dans ce dossier.") except Exception as e: - print(f"Une erreur est survenue : {e}") + print(f"❌ ERREUR INATTENDUE : {e}") if __name__ == "__main__": - main() + main() \ No newline at end of file