Application de messagerie sécurisée avec chiffrement E2E (RSA + AES-GCM), construite avec React, FastAPI et MySQL.
Phantom est une application de messagerie instantanée conçue pour garantir la confidentialité totale de vos échanges.
Chaque message est chiffré côté client avant d'être transmis — personne, pas même le serveur, ne peut lire vos conversations.
- ✨ Fonctionnalités
- 🏗️ Architecture & Technologies
- 🔒 Chiffrement
- 🚀 Démarrage rapide (Docker)
- 🛠️ Installation manuelle
- 📖 Documentation de l'API
⚠️ Limitations connues- 📄 Licence
- 💬 Messagerie instantanée — Communication en temps réel via Long Polling
- 🔐 Chiffrement de bout en bout — RSA + AES-GCM, les messages sont chiffrés avant de quitter votre navigateur
- 🖼️ Envoi de médias — Images et audio chiffrés avec AES-GCM pour les données volumineuses
- 🗄️ Stockage local sécurisé — Utilisation d'IndexedDB pour un stockage persistant côté client
- 🐳 Déploiement Docker — Un seul
docker-compose uppour tout lancer
┌──────────────┐ HTTP/REST ┌──────────────┐ SQL ┌──────────────┐
│ │ ◄──────────────────► │ │ ◄────────────► │ │
│ Frontend │ Long Polling │ Backend │ SQLAlchemy │ MySQL │
│ React + Vite│ │ FastAPI │ │ │
│ │ │ Python │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
IndexedDB
(stockage local)
| Couche | Technologies | Rôle |
|---|---|---|
| Frontend | React 19, Vite 6 | Interface utilisateur réactive et moderne |
| Backend | FastAPI, SQLAlchemy, Uvicorn | API REST, logique métier, ORM |
| Base de données | MySQL | Stockage persistant des données serveur |
| Stockage local | IndexedDB | Stockage NoSQL côté navigateur, résistant au cache |
| Chiffrement | RSA, AES-GCM, SHA-256 | Confidentialité et intégrité des échanges |
| DevOps | Docker, Docker Compose | Conteneurisation et déploiement simplifié |
Backend (Python):
| Librairie | Usage |
|---|---|
FastAPI |
Framework API asynchrone haute performance |
SQLAlchemy |
ORM pour la gestion de la base de données |
cryptography |
Hachage des mots de passe (SHA-256) |
colorlog |
Logs colorés et structurés |
sqlacodegen |
Rétro-ingénierie de la BDD vers des modèles Python |
Frontend (JavaScript):
| Librairie | Usage |
|---|---|
React 19 |
Composants UI réactifs |
Vite 6 |
Bundler ultra-rapide avec HMR |
Phantom implémente un chiffrement hybride combinant cryptographie asymétrique et symétrique :
┌─────────────────────────────────────────────────────────────────────┐
│ ENVOI D'UN MESSAGE │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Génération d'une clé AES aléatoire + nonce (os.urandom) │
│ 2. Chiffrement du message avec AES-GCM (clé symétrique) │
│ 3. Chiffrement de la clé AES avec la clé publique RSA du │
│ destinataire │
│ 4. Envoi : message chiffré + clé AES chiffrée + nonce │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ RÉCEPTION DU MESSAGE │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Déchiffrement de la clé AES avec la clé privée RSA │
│ 2. Déchiffrement du message avec AES-GCM + nonce │
│ │
└─────────────────────────────────────────────────────────────────────┘
| Algorithme | Type | Utilisation |
|---|---|---|
| RSA | Asymétrique (paire de clés) | Échange sécurisé de la clé AES |
| AES-GCM | Symétrique | Chiffrement du contenu (messages, images, audio) |
| SHA-256 | Hachage | Hachage des mots de passe (irréversible) |
| os.urandom | Génération aléatoire | Création des sels et nonces cryptographiques |
Phantom utilise le Long Polling pour fournir une communication quasi instantanée sans surcharger le serveur :
async function LongPollingRequest() {
const response = await fetch("http://api/toutLesMessages");
if (response.status === 200) {
const data = await response.json();
setMessage(data);
setTimeout(async () => {
await LongPollingRequest();
}, 500);
} else {
setTimeout(async () => {
await LongPollingRequest();
}, 1000);
}
}La connexion reste ouverte pendant un intervalle défini (30s à 1min). Dès qu'elle se ferme, une nouvelle requête est immédiatement relancée — offrant ainsi une réactivité proche du temps réel.
Méthode recommandée — Un seul outil à installer : Docker
- Docker installé et lancé
-
Cloner le dépôt
git clone https://github.com/votre-utilisateur/Phantom.git cd Phantom -
Corriger les fins de ligne (Windows uniquement)
Dans VS Code, ouvrirwait-for-it.sh→ en bas à droite, changerCRLFenLF. -
Lancer les conteneurs
docker-compose up --build
-
Ouvrir l'application
Rendez-vous sur http://localhost:5173
📦 Backend (Python)
Téléchargez et installez Python 3.10+.
cd BackEnd
pip install -r requirements.txtImportez le schéma SQL situé dans BackEnd/BDD/bdd.sql dans votre instance MySQL.
Copiez le fichier modèle et renseignez vos variables :
cp variables-example.json variables.jsonÉditez variables.json avec vos paramètres (hôte BDD, identifiants, etc.).
uvicorn main:app --reload🎨 Frontend (React)
Téléchargez et installez Node.js.
cd FrontEnd
npm installnpm run devL'application sera accessible sur http://localhost:5173.
Une fois le backend lancé, la documentation interactive de l'API est disponible :
| Interface | URL |
|---|---|
| Swagger UI | http://localhost:8000/docs |
| ReDoc | http://localhost:8000/redoc |
| Problème | Détail |
|---|---|
| 🎙️ Audio Chrome → Safari | L'envoi de messages audio de Chrome vers Safari peut échouer en raison d'une mauvaise conversion WAV → MPEG côté Chrome. |
Ce projet est distribué sous la licence GNU General Public License v3.0.
Voir le fichier LICENSE pour plus de détails.
Fait avec ❤️ et beaucoup de chiffrement