Second Brain documentation

ADR 0072 – Notes chiffrées

Accepté (2026-10-16, mode autonome)

← Toutes les décisions

ADR 0072 – Notes chiffrées

Statut : Accepté (2026-10-16, mode autonome)

Vague 4 du document d’idées : une note sensible (code, mot de passe, santé) dont le serveur ne voit jamais le texte.

Décision

Interface, avec une seule garde côté serveur (« Ajouter à… » refuse un corps qui commence par sbenc:).

  • Enveloppe : le corps d’une note chiffrée est la chaîne sbenc:1:<sel>:<iv>:<texte chiffré> (base64url). AES-GCM 256 bits ; clé dérivée du mot de passe par PBKDF2-SHA-256, 600 000 itérations, sel de 16 octets et vecteur de 12 octets neufs à chaque enregistrement. Web Crypto du navigateur, aucune bibliothèque.
  • Fiche : un bandeau au-dessus du corps. « Chiffrer cette note » demande un mot de passe saisi deux fois et avertit qu’il est irrécupérable. Une note verrouillée masque l’éditeur et demande le mot de passe ; une fausse saisie est refusée (GCM authentifie). Déverrouillée, le texte et le mot de passe restent en mémoire de la fiche (jamais stockés), le corps est chiffré à chaque enregistrement ; « Retirer le chiffrement » enregistre le texte en clair. Quitter la fiche oublie le mot de passe.
  • Enregistrer une note verrouillée (titre, tags, propriétés) renvoie l’enveloppe telle quelle.
  • Aperçu au survol : « Contenu chiffré ».

Limites assumées

  • Le titre, les tags posés à la main, les propriétés d’aspect et les liens ne sont pas chiffrés ; les liens wiki et #tags du corps ne sont pas extraits (le serveur ne voit que l’enveloppe), la recherche plein texte ne trouve pas le contenu.
  • L’enveloppe est indexée comme un texte quelconque (bruit sans effet sur la recherche) et apparaît telle quelle dans les exports et sauvegardes : ils restent chiffrés.
  • « Ajouter à… » refuse une note chiffrée (400), pour ne pas abîmer l’enveloppe.
  • Les suggestions de liens [[, les mentions et les blocs de vue envoient au serveur des fragments de ce qu’on saisit pendant que la note est déverrouillée : le texte enregistré n’est jamais en clair, mais ces requêtes ne sont pas protégées.
  • L’enveloppe n’est réécrite que si le texte change (un titre modifié renvoie la même enveloppe, pas de bruit dans le journal). Le mot de passe est normalisé en NFC.
  • Mot de passe perdu = note perdue. Pas de récupération, pas de changement de mot de passe (retirer puis rechiffrer).
  • Le journal garde la valeur du corps avant/après : les anciennes versions en clair d’une note qui vient d’être chiffrée restent dans l’historique. À purger à la main si besoin.
  • Les fichiers joints ne sont pas chiffrés.

Alternatives écartées

  • Chiffrement côté serveur : le serveur verrait le texte.
  • Verrouillage de session / WebAuthn : plus de confort, plus de pièces ; l’enveloppe versionnée (1) laisse la place.
  • Chiffrer aussi le titre : casserait l’arbre, la palette et les liens.

Conséquences

Tests : body-crypto.spec.ts (aller-retour, mauvais mot de passe, enveloppe altérée), node-editor-page-encryption.spec.ts (le serveur ne reçoit que l’enveloppe), node-encryption-panel.spec.ts.