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]:
