mirror of https://github.com/wg-easy/wg-easy
committed by
GitHub
1 changed files with 0 additions and 147 deletions
@ -1,147 +0,0 @@ |
|||||
import bcrypt |
|
||||
import os |
|
||||
import json |
|
||||
|
|
||||
def generate_salt(cost_factor: int = 12) -> str: |
|
||||
""" |
|
||||
Génère un sel aléatoire avec un facteur de coût spécifié. |
|
||||
|
|
||||
:param cost_factor: Le facteur de coût pour bcrypt (par défaut 12). |
|
||||
:return: Un sel aléatoire sous forme de chaîne hexadécimale. |
|
||||
""" |
|
||||
return bcrypt.gensalt(cost_factor).decode('utf-8') |
|
||||
|
|
||||
def hash_password(password: str, salt: str) -> str: |
|
||||
""" |
|
||||
Convertit un mot de passe en hachage bcrypt avec un sel. |
|
||||
|
|
||||
:param password: Le mot de passe à hacher. |
|
||||
:param salt: Le sel à utiliser pour le hachage. |
|
||||
:return: Le hachage bcrypt du mot de passe avec le sel. |
|
||||
""" |
|
||||
return bcrypt.hashpw(password.encode(), salt.encode()).decode('utf-8') |
|
||||
|
|
||||
def verify_password(hashed_password: str, password: str) -> bool: |
|
||||
""" |
|
||||
Vérifie si le mot de passe correspond au hachage avec le sel. |
|
||||
|
|
||||
:param hashed_password: Le hachage bcrypt du mot de passe avec le sel. |
|
||||
:param password: Le mot de passe à vérifier. |
|
||||
:return: True si le mot de passe correspond au hachage, False sinon. |
|
||||
""" |
|
||||
return bcrypt.checkpw(password.encode(), hashed_password.encode()) |
|
||||
|
|
||||
def save_to_file(salt: str, hashed_password: str, filename: str): |
|
||||
""" |
|
||||
Sauvegarde le sel et le hachage dans un fichier. |
|
||||
|
|
||||
:param salt: Le sel utilisé pour le hachage. |
|
||||
:param hashed_password: Le hachage du mot de passe. |
|
||||
:param filename: Le nom du fichier où sauvegarder les données. |
|
||||
""" |
|
||||
data = { |
|
||||
'salt': salt, |
|
||||
'hashed_password': hashed_password |
|
||||
} |
|
||||
with open(filename, 'w') as file: |
|
||||
json.dump(data, file) |
|
||||
|
|
||||
def load_from_file(filename: str): |
|
||||
""" |
|
||||
Charge le sel et le hachage depuis un fichier. |
|
||||
|
|
||||
:param filename: Le nom du fichier où charger les données. |
|
||||
:return: Le sel et le hachage du mot de passe. |
|
||||
""" |
|
||||
with open(filename, 'r') as file: |
|
||||
data = json.load(file) |
|
||||
return data['salt'], data['hashed_password'] |
|
||||
|
|
||||
def get_cost_factor(): |
|
||||
""" |
|
||||
Demande à l'utilisateur d'entrer un facteur de coût valide. |
|
||||
|
|
||||
:return: Le facteur de coût entré par l'utilisateur. |
|
||||
""" |
|
||||
while True: |
|
||||
cost_factor_input = input("Entrez le facteur de coût (par défaut 12, typiquement entre 4 et 31) : ") |
|
||||
if cost_factor_input == '': |
|
||||
return 12 # Utiliser la valeur par défaut si l'utilisateur n'entre rien |
|
||||
try: |
|
||||
cost_factor = int(cost_factor_input) |
|
||||
if 4 <= cost_factor <= 31: |
|
||||
return cost_factor |
|
||||
else: |
|
||||
print("Le facteur de coût doit être entre 4 et 31. Veuillez réessayer.") |
|
||||
except ValueError: |
|
||||
print("Veuillez entrer un nombre valide.") |
|
||||
|
|
||||
def main(): |
|
||||
while True: |
|
||||
print("\nOptions:") |
|
||||
print("1. Saisir un mot de passe et générer un hachage.") |
|
||||
print("2. Vérifier la correspondance entre un hachage et un mot de passe.") |
|
||||
print("3. Sauvegarder le sel et le hachage dans un fichier.") |
|
||||
print("4. Charger le sel et le hachage depuis un fichier.") |
|
||||
print("5. Saisir plusieurs mots de passe et générer des hachages.") |
|
||||
print("6. Quitter.") |
|
||||
|
|
||||
choice = input("Choisissez une option (1/2/3/4/5/6): ") |
|
||||
|
|
||||
if choice == '1': |
|
||||
mot_de_passe = input("Entrez le mot de passe : ") |
|
||||
cost_factor = get_cost_factor() |
|
||||
sel = generate_salt(cost_factor) |
|
||||
hash_mot_de_passe = hash_password(mot_de_passe, sel) |
|
||||
print(f"Sel : {sel}") |
|
||||
print(f"Hachage du mot de passe : {hash_mot_de_passe}") |
|
||||
|
|
||||
elif choice == '2': |
|
||||
try: |
|
||||
hash_mot_de_passe = input("Entrez le hachage du mot de passe : ") |
|
||||
mot_de_passe_a_verifier = input("Entrez le mot de passe à vérifier : ") |
|
||||
correspondance = verify_password(hash_mot_de_passe, mot_de_passe_a_verifier) |
|
||||
print(f"Le mot de passe correspond-il au hachage ? {correspondance}") |
|
||||
except Exception as e: |
|
||||
print(f"Erreur lors de la vérification du mot de passe : {e}") |
|
||||
|
|
||||
elif choice == '3': |
|
||||
try: |
|
||||
sel = input("Entrez le sel : ") |
|
||||
hash_mot_de_passe = input("Entrez le hachage du mot de passe : ") |
|
||||
filename = input("Entrez le nom du fichier pour sauvegarder les données : ") |
|
||||
save_to_file(sel, hash_mot_de_passe, filename) |
|
||||
print(f"Données sauvegardées dans {filename}") |
|
||||
except Exception as e: |
|
||||
print(f"Erreur lors de la sauvegarde des données : {e}") |
|
||||
|
|
||||
elif choice == '4': |
|
||||
try: |
|
||||
filename = input("Entrez le nom du fichier pour charger les données : ") |
|
||||
sel, hash_mot_de_passe = load_from_file(filename) |
|
||||
print(f"Sel : {sel}") |
|
||||
print(f"Hachage du mot de passe : {hash_mot_de_passe}") |
|
||||
except Exception as e: |
|
||||
print(f"Erreur lors du chargement des données : {e}") |
|
||||
|
|
||||
elif choice == '5': |
|
||||
cost_factor = get_cost_factor() |
|
||||
while True: |
|
||||
mot_de_passe = input("Entrez le mot de passe (ou tapez 'quit' pour arrêter) : ") |
|
||||
if mot_de_passe.lower() == 'quit': |
|
||||
break |
|
||||
sel = generate_salt(cost_factor) |
|
||||
hash_mot_de_passe = hash_password(mot_de_passe, sel) |
|
||||
print(f"Sel : {sel}") |
|
||||
print(f"Hachage du mot de passe : {hash_mot_de_passe}") |
|
||||
|
|
||||
elif choice == '6': |
|
||||
print("Au revoir !") |
|
||||
break |
|
||||
|
|
||||
else: |
|
||||
print("Option invalide. Veuillez choisir une option valide.") |
|
||||
|
|
||||
if __name__ == "__main__": |
|
||||
main() |
|
||||
|
|
Loading…
Reference in new issue