Actualités · La sécurité chez Blackbear
Ce que nous ne pouvons pas lire
Blackbear est local-first. Chaque fonctionnalité marche sur votre appareil, et par défaut vos données ne vivent que là, sans aucun serveur dans la boucle.
Quand vous activez la synchronisation cloud, nos serveurs commencent à transporter vos données entre vos appareils et vos proches. Cette série explique ce que cela implique pour votre vie privée. La partie 1 traite du chiffrement : ce qui quitte votre appareil, et pourquoi nous ne pouvons pas le lire. La partie 2 dresse un registre honnête des métadonnées que nos serveurs conservent bel et bien. La partie 3 traite du partage et de la collaboration.
Tout ce qui suit décrit du code déjà livré, pas des intentions. Quand nous citons un algorithme ou un chiffre, c’est celui qui tourne en production aujourd’hui.
Le chiffrement se fait sur votre appareil
Chaque modification que vous synchronisez est chiffrée avant de toucher le réseau. Notes, documents, tâches, événements, entrées de journal, tableurs, canevas, audio, historique des versions. Chacun est scellé avec XChaCha20-Poly1305, un chiffrement authentifié, avec une clé qui ne quitte jamais votre appareil sans protection. Nos serveurs reçoivent du texte chiffré et stockent du texte chiffré.
Les images et les fichiers audio sont traités de la même façon : chiffrés sur votre appareil, envoyés sous forme de blocs opaques.
Le code qui fait tout cela est une seule implémentation en Rust, construite sur l’écosystème RustCrypto et compilée en WebAssembly. L’app et le CLI Blackbear la partagent, octet pour octet, et nous la testons avec des jeux de données communs à plusieurs langages pour qu’aucune seconde implémentation ne puisse dériver en silence.
Ce que cela protège, et ce que cela ne protège pas
Le chiffrement est un outil précis, pas un champ de force. Avant les détails, les limites.
Cette conception vous protège :
- D’une intrusion passive dans nos serveurs ou notre base de données, c’est-à-dire d’un vol des données stockées. Ce qui fuit, ce sont du texte chiffré et des clés enrobées.
- De nous. Nos systèmes de production ne reçoivent jamais vos clés de contenu ni votre texte en clair : une demande légale portant sur votre contenu ne donne que ce que nous détenons réellement, des métadonnées (partie 2) et des blocs scellés.
Elle ne vous protège pas :
- D’un appareil compromis, volé ou déverrouillé. Votre appareil détient vos clés ; sa sécurité est le socle sur lequel repose tout le reste.
- De quiconque connaît votre phrase secrète ou vos douze mots de récupération.
- De ce que font les destinataires autorisés de ce que vous partagez. Partager, c’est faire confiance à des personnes, pas seulement aux mathématiques.
- Des métadonnées de trafic : qui, quand, combien. C’est tout le sujet de la partie 2.
- De l’app elle-même. Sur le web, l’app arrive de nos serveurs à chaque chargement ; sur ordinateur, par des versions signées. Aucun schéma de chiffrement ne résiste à une app malveillante, qui que soit son éditeur.
- Des moments où vous choisissez d’envoyer des données en clair : demander à Pax d’utiliser un modèle cloud, connecter un calendrier externe, exporter des fichiers, envoyer une invitation par e-mail. Ces données partent délibérément vers le tiers que vous avez choisi, sous ses propres règles, et non sous notre chiffrement.
La hiérarchie des clés
Votre phrase secrète ne quitte jamais votre appareil. Tout en découle :
- Votre phrase secrète passe par Argon2id, une fonction de dérivation de clé gourmande en mémoire, réglée sur 64 MiB de mémoire, trois passes et quatre voies. Il en sort votre clé de compte.
- Votre clé de compte enrobe votre clé de coffre : une clé aléatoire de 256 bits générée sur votre appareil. C’est la clé de coffre qui chiffre réellement vos données.
- Nos serveurs stockent la clé de coffre enrobée, le sel et les paramètres de réglage. La clé enrobée est elle-même du texte chiffré. Sans votre phrase secrète, ce n’est que du bruit.
Le serveur ne stocke que les copies enrobées : du texte chiffré qui protège du texte chiffré.
Pourquoi ce détour ? Il vous permet de changer de phrase secrète sans rechiffrer toute votre vie, et il permet à la récupération d’exister sans affaiblir la porte d’entrée.
Une mise en garde qui mérite d’être écrite noir sur blanc : Argon2id rend chaque tentative coûteuse ; il ne peut pas rendre forte une phrase secrète faible. La clé de coffre enrobée est exactement aussi solide que la phrase secrète qui l’enrobe. Choisissez-en une longue.
La récupération tient en douze mots
Quand vous configurez la synchronisation, Blackbear vous donne une phrase de récupération : douze mots (BIP39) qui encodent 128 bits d’entropie. Ils permettent de dériver une clé indépendante qui enrobe une seconde fois votre clé de coffre.
Vous avez perdu votre phrase secrète ? Les douze mots vous permettent de revenir. Vous avez perdu les deux ? Vos données synchronisées sont perdues. Nous ne pouvons pas les réinitialiser, et aucune demande au support ne nous en convaincra, car il n’y a rien à réinitialiser de notre côté. Ce n’est pas une lacune de notre support. C’est la conception qui tient.
Ajouter un appareil
Sur un nouvel appareil, vous saisissez votre phrase secrète. Elle dérive localement votre clé de compte et désenrobe la clé de coffre à partir de la copie enrobée que détient notre serveur. Le serveur ne voit jamais la phrase secrète, ni le résultat.
Un appareil déjà déverrouillé peut aussi transmettre la clé directement. Il scelle la clé de coffre pour la clé publique X25519 du nouvel appareil et la dépose dans un emplacement de transfert qui s’autodétruit au bout de cinq minutes, utilisé ou non. Une limite honnête ici : votre appareil existant apprend la clé publique du nouvel appareil par l’intermédiaire de votre compte connecté, si bien que ce parcours assisté fait confiance à notre serveur pour relayer la bonne clé pour l’appareil que vous avez choisi. Le parcours par phrase secrète ne demande pas cette confiance.
Comme ce vocabulaire est exactement celui qu’emprunterait un hameçonneur, une règle mérite d’être écrite noir sur blanc : nous ne vous demanderons jamais votre phrase secrète ni vos mots de récupération, et nous ne vous demanderons jamais d’approuver un transfert d’appareil. Ces demandes n’ont leur place que dans une app que vous avez ouverte vous-même. Toute autre demande est une attaque.
Les messages
La messagerie utilise ses propres clés, distinctes de celles de la synchronisation. Chaque compte a une identité de messagerie X25519, et chaque message dérive une clé unique à partir d’un sel neuf propre au message, via HKDF-SHA256. Les messages voyagent dans des enveloppes scellées. Le serveur les relaie ; il ne peut pas les ouvrir. La partie 2 détaille ce que révèle l’extérieur de l’enveloppe.
Une remarque de conception, dite simplement : des clés uniques par message ne sont pas le cliquet à rotation qu’utilisent certaines messageries. Si la clé de messagerie à long terme d’un appareil était un jour compromise, les messages scellés pour elle seraient exposés. Les clés par message limitent les dégâts ; elles n’offrent pas de confidentialité persistante, et nous préférons que vous connaissiez la différence.
Un historique sans empreinte du contenu
L’historique des versions se synchronise sous forme d’instantanés chiffrés, repérés par des identifiants propres à votre coffre. Si vous et un inconnu enregistrez un fichier identique, le serveur voit deux identifiants sans rapport : des contenus identiques ne peuvent pas être rapprochés d’un compte à l’autre. La taille et le moment restent visibles, comme pour tout le trafic de synchronisation. Ce sont des métadonnées, et c’est le sujet de la partie 2.
Prouver sans révéler
Les opérations destructrices sur le compte exigent une preuve de coffre : une signature produite par une clé Ed25519 dérivée de votre clé de coffre. Vous prouvez que vous détenez le coffre sans que le coffre ne voyage jamais. Et une fois leur travail en mémoire terminé, les clés sont effacées.
Rien de tout cela n’est exotique. XChaCha20-Poly1305, Argon2id, X25519, Ed25519, HKDF-SHA256 : des primitives standard, sans surprise, longuement éprouvées. Ce qui compte, c’est la rigueur de les appliquer partout, et de dire clairement ce qu’elles ne couvrent pas. C’est de cette rigueur que parle la suite de cette série.
Pour aller plus loin
- Local-first software — l’essai d’Ink & Switch à l’origine de cette philosophie
- RFC 9106 — la spécification d’Argon2
- XChaCha20-Poly1305 — le projet de spécification de l’IETF
- RFC 7748 — les courbes elliptiques derrière X25519
- RFC 8032 — les signatures Ed25519
- The Password Hashing Competition — le concours remporté par Argon2
La sécurité chez Blackbear
- 1. Ce que nous ne pouvons pas lire (vous êtes ici)
- 2. Ce que nos serveurs peuvent voir
- 3. Un partage qui reste scellé