"""系统账号密码的加解密(Fernet 对称加密)。 密钥来自 .env 的 ACCOUNT_ENC_KEY。生成方式: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" """ from cryptography.fernet import Fernet, InvalidToken from backend.config import settings def _fernet() -> Fernet: key = (settings.account_enc_key or "").strip() if not key: raise RuntimeError( "未配置 ACCOUNT_ENC_KEY,无法保存或读取系统账号。" '生成:python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())",' "写入 .env 后重启后端。" ) return Fernet(key.encode("ascii")) def encrypt_secret(plain: str) -> str: return _fernet().encrypt(plain.encode("utf-8")).decode("ascii") def decrypt_secret(token: str) -> str: try: return _fernet().decrypt(token.encode("ascii")).decode("utf-8") except InvalidToken as e: raise RuntimeError("账号密码解密失败:当前 ACCOUNT_ENC_KEY 与加密时使用的不一致") from e def generate_key() -> str: return Fernet.generate_key().decode("ascii")