Aller au contenu
MathysCheruel
Tous les projets
042026 · Projet personnel

VaultOne

Un gestionnaire de mots de passe zero-knowledge synchronisé entre Windows et mobile.

Année
2026
Statut
Projet personnel
Rôle
Conception et développement
Stack
Electron, React, TypeScript, Node.js, Express, MariaDB, Firebase, PWA, Claude Code (Opus 4.8)

Contexte

VaultOne est un projet personnel de gestionnaire de mots de passe disponible sous la forme d’une application Windows native et d’une PWA installable sur mobile. Les deux clients utilisent le même compte, la même interface et un coffre synchronisé à travers une API commune.

Problématique

La synchronisation d’informations sensibles impose généralement de confier une partie de leur sécurité au serveur. L’enjeu était de permettre cette synchronisation tout en garantissant que les mots de passe, les catégories et la clé du coffre restent illisibles en cas d’accès à la base de données ou à l’infrastructure.

Solution

VaultOne repose sur une architecture zero-knowledge : chaque entrée est chiffrée localement avant son envoi et le serveur ne conserve que du ciphertext. Un monorepo TypeScript partage le noyau cryptographique, la logique métier et l’interface React entre l’application Electron et la PWA, tout en isolant la clé dans un contexte propre à chaque plateforme.

Fonctionnalités

  • 01Coffre-fort chiffré et synchronisé entre Windows et mobile
  • 02Connexion par email ou Google avec OAuth PKCE
  • 03Organisation par catégories, favoris et recherche locale
  • 04Générateur de mots de passe cryptographiquement sûr
  • 05Calcul de l’entropie et estimation de la résistance au cassage
  • 06Import et export aux formats CSV et JSON
  • 07Sauvegarde chiffrée et restauration du coffre
  • 08Journal d’activité et préférences persistantes
  • 09Installation en PWA et mises à jour automatiques sur Windows

Choix techniques

  • Architecture zero-knowledge

    Les données sont chiffrées localement avec AES-256-GCM avant leur transmission. Le serveur ne reçoit jamais le mot de passe maître, la clé du coffre ou des données en clair et ne stocke que du ciphertext.

  • Isolation des clés

    La clé reste dans le processus principal de l’application Electron ou dans un Web Worker pour la PWA. L’interface React n’y accède jamais directement, ce qui réduit son exposition en cas de faille au niveau de l’interface.

  • Enveloppe de clés

    Une clé aléatoire chiffre le contenu du coffre tandis qu’une clé dérivée du mot de passe maître avec Argon2id protège cette clé. Un changement de mot de passe ne nécessite donc pas de rechiffrer toutes les entrées.

  • Monorepo multiplateforme

    Les clients Electron et PWA partagent le noyau cryptographique, la logique métier et les composants React. Seule l’intégration propre à chaque plateforme est séparée, ce qui limite les divergences de comportement.

  • Intégrité des données

    Chaque entrée est stockée dans un blob chiffré associé cryptographiquement à son identifiant grâce aux données authentifiées d’AES-GCM. Une entrée ne peut donc pas être déplacée ou substituée sans rendre son déchiffrement invalide.

Stack

  • Electron
  • React
  • TypeScript
  • Node.js
  • Express
  • MariaDB
  • Firebase
  • PWA
  • Claude Code (Opus 4.8)

Difficultés

  • Garantir la compatibilité cryptographique entre Node.js, Electron et Safari
  • Synchroniser un même coffre sans exposer ses données au serveur
  • Isoler les clés de chiffrement de l’interface React sur chaque plateforme
  • Préserver la compatibilité avec les coffres créés par les versions précédentes
  • Empêcher la corruption silencieuse des données liée à la configuration SQL

Ce que j'ai appris

  • Concevoir une architecture de sécurité dans laquelle le serveur n’est pas une autorité de confiance
  • Partager une logique métier complexe entre une application desktop et une PWA
  • Utiliser Argon2id, AES-256-GCM et les données authentifiées dans un cas concret
  • Sécuriser un flux OAuth desktop avec PKCE et le navigateur système
  • Transformer des incidents techniques en protections automatiques contre les régressions