Files
live-campus-mcs-p-2027.2/Semaine_08/secuvault/infra/crypto.py
T
gauvainboiche 3315cb2336 feat: Semaine 8
2026-05-11 09:25:19 +02:00

38 lines
1.3 KiB
Python

'''
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")