''' Là encore, j'ai délégué à Clause Sonnet 4.6 (voir secrets.py pour la partie 1) Je dois avouer une chose : chercher sur Internet est devenu un enfer. Je ne sais pas comment faire pour trouver des ressources pertinentes, et j'ai l'impression que les résultats sont de moins bonne qualité qu'avant. J'ai donc préféré déléguer à l'IA. En revanche il n'y a rien de sorcier. ''' import os import bcrypt from cryptography.fernet import Fernet _KEY_FILE = "secret.key" def _load_or_create_key() -> bytes: if os.path.exists(_KEY_FILE): with open(_KEY_FILE, "rb") as fh: return fh.read().strip() key = Fernet.generate_key() with open(_KEY_FILE, "wb") as fh: fh.write(key) return key _fernet = Fernet(_load_or_create_key()) def hash_password(password: str) -> str: return bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8") def verify_password(password: str, password_hash: str) -> bool: return bcrypt.checkpw(password.encode("utf-8"), password_hash.encode("utf-8")) def encrypt_secret(plaintext: str) -> str: return _fernet.encrypt(plaintext.encode("utf-8")).decode("utf-8") def decrypt_secret(ciphertext: str) -> str: return _fernet.decrypt(ciphertext.encode("utf-8")).decode("utf-8")