Files
live-campus-mcs-p-2027.2/Semaine_08/secuvault
gauvainboiche 3315cb2336 feat: Semaine 8
2026-05-11 09:25:19 +02:00
..
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00
2026-05-11 09:25:19 +02:00

SecuVault

Coffre-fort de mots de passe partagés - FastAPI + Jinja2 + SQLite.


Installation

uv init --python 3.12
uv run ./main.py

.venv\Scripts\activate

uv add uvicorn jinja2 bcrypt cryptography fastapi itsdangerous python-multipart

uvicorn main:app --reload --host localhost --port 8080

La base de données (secuvault.db) et la clé de chiffrement (secret.key) sont créées automatiquement au premier démarrage.

Comptes de test

Utilisateur Équipes
alice devops
bob devops + marketing
charlie marketing

Architecture (3 couches strictes)

domain/            # RÈGLES MÉTIER UNIQUEMENT
  models/          # Entités : User, Team, Secret (dataclasses)
  exceptions.py    # Erreurs métier (AccessDeniedError, ConflictError…)
  services.py      # Cas d'usage & contrôle d'accès (AUCUNE règle en dehors d'ici)

infra/             # ACCÈS AUX DONNÉES
  crypto.py        # Hachage bcrypt + chiffrement Fernet
  database.py      # Connexion SQLite, schéma, provisioning
  repositories.py  # CRUD : UserRepository, TeamRepository, SecretRepository

presentation/      # INTERFACE UTILISATEUR (contrôleurs minces)
  schemas.py       # Validation Pydantic des formulaires
  routes/
    auth.py        # GET/POST /login, GET /logout
    secrets.py     # GET/POST /secrets  (liste, détail, création, rotation)
  templates/       # Jinja2 - affichage uniquement, aucune règle métier

Fonctionnalités de sécurité

  • Chiffrement : secrets chiffrés en AES-128-CBC + HMAC.
  • Hachage : mots de passe hachés avec bcrypt.
  • Contrôle d'accès : toutes les règles d'accès sont dans domain/services.py ; aucune vérification dans les routes ni les templates.
  • Verrouillage optimiste : colonne version sur chaque secret ; une rotation concurrente est détectée et signalée à l'utilisateur (voir ATTACKS.md).
  • Session : cookies signés (HMAC via itsdangerous / Starlette SessionMiddleware).

Variable d'environnement

Variable Défaut (dev uniquement) Usage
SESSION_SECRET secuvault-dev-secret-please-change-in-production Clé de signature des cookies de session

Production : définir SESSION_SECRET avec une valeur aléatoire longue et garder secret.key hors du dépôt.