38 lines
1.3 KiB
Python
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") |