Skip to content

ADR 004 — Migration passlib vers bcrypt direct

Contexte

Sprint 2 — Dette technique identifiée lors du Sprint 1. passlib 1.7.4 est abandonné depuis 2023. Incompatible avec bcrypt >= 4.0.0 car passlib accède a bcrypt.about.version supprime dans bcrypt 4.0.0.

Solution temporaire Sprint 1 : pin bcrypt<4.0.0 Solution definitive Sprint 2 : migration vers bcrypt direct

Probleme

passlib 1.7.4 + bcrypt >= 4.0.0 : AttributeError: module 'bcrypt' has no attribute 'about'

Consequence : les tests plantaient avec bcrypt >= 4.0.0 Workaround : bcrypt<4.0.0 dans requirements.in

Decision

Migrer de passlib vers bcrypt direct. Supprimer la contrainte de version bcrypt.

Changements

app/utils.py

AVANT : from passlib.context import CryptContext pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") return pwd_context.hash(password) return pwd_context.verify(plain_password, hashed_password)

APRES : import bcrypt password_bytes = password.encode("utf-8") salt = bcrypt.gensalt() hashed = bcrypt.hashpw(password_bytes, salt) return hashed.decode("utf-8")

return bcrypt.checkpw( plain_password.encode("utf-8"), hashed_password.encode("utf-8") )

requirements.in

AVANT : passlib bcrypt<4.0.0

APRES : bcrypt

Avantages

  • bcrypt 5.0.0 supporte
  • Moins de dependances (passlib supprime)
  • Maintenance directe par la lib activement maintenue
  • Plus de contrainte de version
  • 34 tests passent, coverage 95%

Compatibilite hashes existants

Les hashes bcrypt generes par passlib sont compatibles avec bcrypt direct. Aucune migration de donnees necessaire. Les utilisateurs existants peuvent se connecter normalement.

References

  • Ticket : #14 security: migrate passlib to bcrypt direct
  • Date : 2026-05-10
  • bcrypt version : 5.0.0
  • python version : 3.10 (Dockerfile) / 3.12 (local)