import hashlib import hmac import os import secrets from datetime import datetime, timedelta from jose import jwt from .config import settings ALGORITHM = "HS256" def hash_secret(value: str) -> str: salt = os.urandom(16) digest = hashlib.pbkdf2_hmac("sha256", value.encode(), salt, 120_000) return f"pbkdf2_sha256$120000${salt.hex()}${digest.hex()}" def verify_secret(value: str, encoded: str) -> bool: try: _, rounds, salt_hex, digest_hex = encoded.split("$") digest = hashlib.pbkdf2_hmac("sha256", value.encode(), bytes.fromhex(salt_hex), int(rounds)) return hmac.compare_digest(digest.hex(), digest_hex) except (ValueError, TypeError): return False def create_access_token(user_id: int) -> str: expires = datetime.utcnow() + timedelta(minutes=settings.jwt_expire_minutes) return jwt.encode({"sub": str(user_id), "exp": expires}, settings.jwt_secret, algorithm=ALGORITHM) def create_refresh_token() -> str: return secrets.token_urlsafe(48)