# SecuVault Coffre-fort de mots de passe partagés - FastAPI + Jinja2 + SQLite. --- ## Installation ```bash 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.