app/core/encryption.py:15:def _load_or_create_key() -> bytes: app/core/encryption.py:39:def encrypt(value: str) -> str: app/core/encryption.py:45:def decrypt(value: str) -> str: app/core/encryption.py:51:def rotate_key_clear() -> None: # pragma: no cover - admin utility app/core/security.py:20:def hash_password(p: str) -> str: app/core/security.py:25:def verify_password(plain: str, hashed: str) -> bool: app/core/security.py:36:def create_access_token(user_id: int, expires_minutes: Optional[int] = None) -> str: app/core/security.py:46:def decode_token(token: str) -> Optional[dict]: app/core/security.py:53:def sanitize_log_payload(payload: dict) -> dict: app/core/security.py:66:async def log_audit(db: AsyncSession, user_id: Optional[int], action: str, app/core/security.py:94:def rate_limit(key: str, limit: int = None, window: int = 60) -> tuple[bool, int]: