1. Dérivation des clés
Le mot de passe maître ne quitte jamais votre appareil. Il traverse Argon2id (mémoire ≥ 64 Mo, ≥ 3 itérations, parallélisme calibré par plateforme) avec votre email comme sel, pour produire une masterKey de 256 bits.
Cette masterKey est ensuite étirée par HKDF-SHA256 en deux clés distinctes : une clé de chiffrement (stretchedMasterKey) et un hash d'authentification (masterPasswordHash) envoyé au serveur — non réversible, re-haché côté serveur avant stockage.
2. Clé de coffre protégée (Protected Symmetric Key)
Une vaultKey aléatoire de 256 bits est générée à la création du compte et chiffrée par la stretchedMasterKey. Le serveur ne stocke que sa version chiffrée. Conséquence directe : changer de mot de passe maître ne re-chiffre que cette petite clé, jamais l'intégralité du coffre.
3. Chiffrement de chaque entrée
Chaque entrée (identifiant, mot de passe, notes, seed TOTP, champs personnalisés) est chiffrée individuellement en AEAD — XChaCha20-Poly1305 ou AES-256-GCM — avec la vaultKey et un nonce aléatoire unique à chaque écriture. Le format d'un blob est version | algo | nonce | ciphertext | tag : l'authentification (AEAD) garantit à la fois confidentialité et intégrité. Seules des métadonnées minimales de tri (dossier, favori) peuvent rester en clair — jamais une URL, un identifiant ou un mot de passe.
4. Authentification & session
Au login, le client dérive et envoie masterPasswordHash ; le serveur le vérifie (Argon2id du hash reçu) et renvoie un token de session court, avec refresh. La 2FA (TOTP/WebAuthn) est proposée en option ; le déverrouillage local exige le mot de passe maître à chaque ouverture, ou une biométrie qui débloque une clé déjà stockée en keystore/enclave sécurisée.
5. Stockage & synchronisation
Le serveur ne stocke que du ciphertext et des métadonnées de synchronisation (révisions, horodatages, tombstones), sur une infrastructure souveraine hébergée en Europe. La synchro multi-appareils repose sur des révisions avec résolution de conflits (dernier écrit gagne par champ + journal). Une clé de récupération optionnelle (128 bits, générée à l'inscription) est l'unique filet de sécurité si le mot de passe maître est perdu — sans elle, le coffre reste irrécupérable : c'est le prix du zero-knowledge réel.
6. Un seul cœur crypto, partagé
Le cœur crypto (packages/crypto-core) est écrit en TypeScript portable, sans dépendance réseau, testé par des vecteurs de test et des cas dégradés (mauvais mot de passe, tag invalide, nonce rejoué). Il est utilisé identiquement par le web, Android et iOS : un seul code audité, pas une réimplémentation par plateforme.
7. Invariants non négociables
- Aucun secret en clair n'atteint jamais le serveur, les journaux, la télémétrie, une URL ou un stockage non chiffré.
- Uniquement des primitives éprouvées (libsodium / WebCrypto / Argon2id) — jamais de crypto maison.
- Nonce aléatoire unique par chiffrement ; AEAD partout.
- Le mot de passe maître n'est ni stocké, ni transmis, ni loggué.
- Toute clé en mémoire est effacée dès que possible.
- Revue de sécurité avant tout usage avec de vrais identifiants.