Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

106 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔐 Phantom — Messagerie Chiffrée de Bout en Bout

Application de messagerie sécurisée avec chiffrement E2E (RSA + AES-GCM), construite avec React, FastAPI et MySQL.

License: GPL v3 Python React FastAPI Docker


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.


📑 Table des matières


✨ Fonctionnalités

  • 💬 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 up pour tout lancer

🏗️ Architecture & Technologies

┌──────────────┐       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é

Librairies notables

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

🔒 Chiffrement

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

Communication en temps réel — Long Polling

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.


🚀 Démarrage rapide (Docker)

Méthode recommandée — Un seul outil à installer : Docker

Prérequis

Étapes

  1. Cloner le dépôt

    git clone https://github.com/votre-utilisateur/Phantom.git
    cd Phantom
  2. Corriger les fins de ligne (Windows uniquement)
    Dans VS Code, ouvrir wait-for-it.sh → en bas à droite, changer CRLF en LF.

  3. Lancer les conteneurs

    docker-compose up --build
  4. Ouvrir l'application
    Rendez-vous sur http://localhost:5173


🛠️ Installation manuelle

📦 Backend (Python)

1. Installer Python

Téléchargez et installez Python 3.10+.

2. Installer les dépendances

cd BackEnd
pip install -r requirements.txt

3. Créer la base de données

Importez le schéma SQL situé dans BackEnd/BDD/bdd.sql dans votre instance MySQL.

4. Configurer les variables

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.).

5. Lancer le serveur

uvicorn main:app --reload
🎨 Frontend (React)

1. Installer Node.js

Téléchargez et installez Node.js.

2. Installer les dépendances

cd FrontEnd
npm install

3. Lancer le serveur de développement

npm run dev

L'application sera accessible sur http://localhost:5173.


📖 Documentation de l'API

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

⚠️ Limitations connues

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.

📄 Licence

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

About

Application de messagerie sécurisée de bout en bout (chiffrement E2E), développée en JavaScript.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages