diff --git a/backend/app/security.py b/backend/app/security.py index 2d9c5fc..4fb79b1 100644 --- a/backend/app/security.py +++ b/backend/app/security.py @@ -1,21 +1,27 @@ from datetime import datetime, timedelta, timezone +import bcrypt from jose import JWTError, jwt -from passlib.context import CryptContext from .config import get_settings settings = get_settings() -pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +# bcrypt akzeptiert maximal 72 Bytes – längere Passwörter werden abgeschnitten. +_BCRYPT_MAX_BYTES = 72 def hash_password(password: str) -> str: - return pwd_context.hash(password) + pw = password.encode("utf-8")[:_BCRYPT_MAX_BYTES] + return bcrypt.hashpw(pw, bcrypt.gensalt()).decode("utf-8") def verify_password(password: str, password_hash: str) -> bool: - return pwd_context.verify(password, password_hash) + try: + pw = password.encode("utf-8")[:_BCRYPT_MAX_BYTES] + return bcrypt.checkpw(pw, password_hash.encode("utf-8")) + except (ValueError, TypeError): + return False def create_access_token(subject: str, role: str) -> str: diff --git a/backend/requirements.txt b/backend/requirements.txt index bde3733..99a6b17 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -5,7 +5,6 @@ psycopg2-binary==2.9.10 pydantic==2.10.4 pydantic-settings==2.7.1 python-jose[cryptography]==3.3.0 -passlib[bcrypt]==1.7.4 bcrypt==4.2.1 httpx==0.28.1 python-dateutil==2.9.0.post0