"""用户 AI api_key 的对称加密(Fernet)。密钥来自 settings.fernet_key。""" from cryptography.fernet import Fernet, InvalidToken from app.config import settings def _fernet() -> Fernet: if not settings.fernet_key: raise RuntimeError( "FERNET_KEY 未配置,无法加解密用户 api_key。" "生成:python -c \"from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())\"" ) return Fernet(settings.fernet_key.encode("utf-8")) def encrypt(plaintext: str) -> str: return _fernet().encrypt(plaintext.encode("utf-8")).decode("utf-8") def decrypt(token: str) -> str | None: try: return _fernet().decrypt(token.encode("utf-8")).decode("utf-8") except (InvalidToken, ValueError): return None