Télécharger
Version 1.0 — Mars 2026

Sécurité des données de santé

Architecture cryptographique de la synchronisation locale entre postes de cabinet médical. Document technique complet — chiffrement de bout en bout, sans compromis.

  • Aucune donnée patient ne transite par nos serveurs
  • Chiffrement Noise KK — même framework que Signal et WireGuard
  • Certificats signés par une CA intégrée, vérifiables hors ligne
  • Forward secrecy sur chaque session
  • Architecture auditée et formellement vérifiée
  • Conforme RGPD Art. 32 et aligné ISO 27001

Résumé

Ocureo est une application desktop pour orthoptistes qui synchronise les dossiers patients entre postes de travail sur un réseau local, sans faire transiter aucune donnée clinique par un serveur externe. Ce document décrit l’architecture cryptographique qui sécurise cette synchronisation. La conception combine trois composants établis dans une configuration originale : (1) le Noise Protocol Framework [1], pattern KK, pour le chiffrement de session authentifié ; (2) une Autorité de Certification (CA) intégrée hébergée sur le backend SaaS pour la certification d’identité des postes ; (3) un protocole d’appairage (pairing) par Short Authentication String (SAS), inspiré de ZRTP [27] et du Bluetooth Secure Simple Pairing, pour la vérification hors bande. L’architecture adopte un environnement LAN zero trust conformément à NIST SP 800-207 [7] et vise la conformité avec l’article 32 du RGPD et les contrôles de l’Annexe A de l’ISO/IEC 27001:2022. Au-delà de la couche cryptographique, le système repose sur un modèle CRDT custom (HLC + LWW) pour la convergence des données, un protocole de transfert de fichiers avec vérification SHA-256, et un mécanisme de verrouillage distribué pour la coordination des accès concurrents. La conformité de l’implémentation est validée contre les vecteurs de test de référence cacophony. Les propriétés de sécurité du pattern Noise KK ont été formellement vérifiées par des travaux académiques indépendants [11][12][13][14].


Table des matières

  1. Modèle de menace
  2. Vue d’ensemble de l’architecture
  3. Identité des postes et gestion des clés
  4. Autorité de Certification intégrée
  5. Protocole d’appairage
  6. Chiffrement de session : Noise KK
  7. Révocation et cycle de vie des certificats
  8. Synchronisation des données
  9. Synchronisation des fichiers
  10. Verrouillage distribué
  11. Isolation sauvegarde/restauration
  12. Périmètre des données : ce que voit le serveur
  13. Conformité réglementaire
  14. Validation
  15. Limites connues
  16. État de l’art
  17. Références

1. Modèle de menace

1.1 Actifs protégés

ActifClassificationBase réglementaire
Dossiers patients (bilans, examens)RGPD Art. 9 — catégorie spéciale (données de santé)RGPD Art. 32, Art. 5.1.f
Intégrité des échanges (absence de falsification)IntégritéRGPD Art. 5.1.f
Disponibilité de la synchronisationDisponibilitéContinuité d’activité

1.2 Modèle d’attaquant

Nous adoptons un modèle Dolev-Yao restreint au segment LAN. L’attaquant :

  • Peut observer, intercepter, modifier, supprimer, rejouer et injecter tout message sur le réseau local (ex. : WiFi compromis, ARP spoofing, équipement tiers sur réseau partagé).
  • Peut énumérer les postes annoncés via la découverte multicast (NSD/Bonjour).
  • Ne peut pas compromettre le serveur backend (considéré comme de confiance pour les opérations CA — voir §4.3 pour la discussion de cette hypothèse).
  • Ne peut pas obtenir un accès physique aux postes enregistrés.
  • Ne peut pas casser les primitives cryptographiques sous-jacentes (hypothèse standard).

Ce modèle reflète la surface d’attaque réaliste d’un cabinet médical : le WiFi de la salle d’attente est partagé, des prestataires de maintenance peuvent connecter des équipements, et le matériel réseau grand public n’offre aucune garantie d’isolation.

1.3 Hypothèses de confiance

EntitéNiveau de confianceJustification
Backend DokitekConfiance pour les opérations d’identité (CA)Comparable à une CA TLS ; n’accède pas aux données cliniques
Stockage sécurisé OS (Keychain/DPAPI)Confiance pour le matériel cryptographiqueFourni par la plateforme, avec support matériel si disponible
Administrateur du cabinetConfiance pour les décisions d’enrôlementVérification visuelle du SAS lors de l’appairage
Infrastructure LANNon fiableZero trust per NIST SP 800-207 [7]

1.4 Objectifs de sécurité

PropriétéMécanismeBase formelle
ConfidentialitéChiffrement de session Noise KK (AEAD ChaCha20-Poly1305)Prouvé dans [11][12][13]
Authentification mutuelleAuthentification par clé statique dans le pattern KK + certificats signés par la CAPropriété Noise KK [1]
Forward secrecyClés DH éphémères par sessionPropriété Noise KK, prouvé dans [14]
IntégritéTag d’authentification AEAD sur chaque messageRFC 8439 [4]
Anti-replayCompteurs de nonce séquentiels dans le transport NoiseNoise spec §5 [1]
Résistance au MITM (appairage)SAS dérivé des hachés de clés publiquesChannel binding, cf. ZRTP [27]

2. Vue d’ensemble de l’architecture

2.1 Pile protocolaire

┌─────────────────────────────────────────┐
│         Couche applicative              │
│   ├── Sync données (CRDT, Knowledge    │
│   │   Vector — §8)                      │
│   ├── Sync fichiers (SHA-256,           │
│   │   transfert par chunks — §9)        │
│   ├── Protocole de verrouillage         │
│   │   (pessimiste, HLC — §10)           │
├─────────────────────────────────────────┤
│         Session Noise KK                │
│   (chiffrement authentifié, PFS)        │
├─────────────────────────────────────────┤
│         Transport WebSocket             │
│   (encadrement, bidirectionnel)         │
├─────────────────────────────────────────┤
│         TCP                             │
│   (livraison fiable)                    │
├─────────────────────────────────────────┤
│         Découverte NSD / Bonjour        │
│   (DNS-SD, mDNS, zero-conf)             │
└─────────────────────────────────────────┘

2.2 Séparation fonctionnelle

L’architecture impose une séparation stricte entre trois plans fonctionnels :

PlanOù il s’exécuteAccès Internet requis
Plan de contrôle — appairage, signature de certificats, émission de CRLBackend (Dokitek)Oui (enrôlement uniquement)
Plan de données — synchronisation des dossiers patients et des fichiersLAN (pair-à-pair)Non
Plan de coordination — verrouillage distribué des ressources, réconciliation par heartbeatLAN (pair-à-pair)Non

Après l’appairage initial, les postes communiquent exclusivement sur le réseau local. Le backend n’est ni impliqué ni informé des échanges de données ou de coordination. Une coupure Internet n’interrompt pas la synchronisation entre les postes déjà enrôlés.


3. Identité des postes et gestion des clés

3.1 Génération des clés

Au premier démarrage, chaque poste génère deux paires de clés indépendantes :

Paire de clésAlgorithmeUsageStandard
Clé de signatureEd25519Preuve d’identité, demandes de certificatRFC 8032 [3]
Clé de sessionX25519Diffie-Hellman Noise KKRFC 7748 [2]

Les clés sont générées via le générateur de nombres aléatoires cryptographiques de l’OS, par l’intermédiaire de libsodium.

3.2 Stockage des clés

Les clés privées sont stockées exclusivement dans le mécanisme de stockage sécurisé du système d’exploitation :

PlateformeStockageProtection
macOSKeychain ServicesSupport matériel (Secure Enclave sur Apple Silicon)
WindowsDPAPI (Data Protection API)Limité à l’utilisateur, lié à la machine

Politique fail-hard : si le stockage sécurisé est indisponible, le sous-système de synchronisation refuse de démarrer. Aucun repli sur un stockage non chiffré, aucun mode dégradé, aucune rétrogradation silencieuse. Ce choix est délibéré, conformément aux recommandations ANSSI-PA-079 §3.1 [15].

3.3 Cycle de vie des clés

PhaseMécanismeRéférence
GénérationAu premier démarrage, automatiqueNIST SP 800-57 Part 1 §5.2 [8]
DistributionVia le protocole d’appairage (§5)
UtilisationSessions Noise KK
Rotation (V1)Manuelle : ré-appairage requisNIST SP 800-57 Part 1 §5.3.6 [8]
Rotation (V2, prévue)Automatique : nouvelle clé signée par la clé précédente (chaîne de confiance)
RévocationCRL signée par la CA (§7)
DestructionSuppression du stockage sécurisé OS lors de la révocation du poste

4. Autorité de Certification intégrée

Cette section décrit la contribution architecturale centrale : l’utilisation du backend SaaS comme Autorité de Certification (CA) intégrée pour la certification d’identité des postes.

4.1 Justification du choix de conception

Dans un petit cabinet médical (2 à 5 postes), le défi fondamental est d’établir une confiance mutuelle entre des postes sur un LAN non fiable. Trois approches ont été étudiées :

ApprocheAvantagesInconvénientsDécision
PKI / KMS externe (ex. : AWS KMS, HashiCorp Vault)Standard industrie, support HSMCoût prohibitif pour un petit cabinet (plusieurs centaines d’EUR/mois) ; complexité opérationnelleRejeté
Poste maître local (un poste fait office de CA)Aucune dépendance serveurPoste maître = point de défaillance unique ; clés sur un laptop potentiellement voléRejeté
CA intégrée au backend (le serveur SaaS signe les certificats)Clé CA jamais sur aucun poste ; simple ; économiqueNécessite Internet pour l’appairage ; confiance dans l’opérateur backendRetenu

L’approche CA intégrée est un compromis pragmatique documenté dans la littérature. NIST SP 800-57 Part 2 [9] définit le concept de « Key Management Organization » — une entité centralisée qui gère les clés cryptographiques pour des participants distribués. Le backend Dokitek remplit exactement ce rôle : il génère, stocke et opère la paire de clés CA pour le compte de chaque cabinet, sans jamais accéder aux données cliniques protégées par les clés de session dérivées.

4.2 Hiérarchie des clés CA

Clé maître AES-256 (KMS cloud, chiffrement par enveloppe)
  └── Paire de clés CA par cabinet (Ed25519)
        ├── Clé privée : chiffrée avec la clé maître, stockée côté serveur
        ├── Clé publique : distribuée à tous les postes enrôlés
        └── Signe : certificats postes, mises à jour CRL
              └── Certificat par poste
                    ├── Clé publique Ed25519 du poste
                    ├── Clé publique X25519 du poste
                    ├── Périmètre cabinet (structurellement lié)
                    └── Signature CA (Ed25519)

4.3 Propriétés de sécurité

Isolation de la clé CA : la clé privée CA est chiffrée au repos (AES-256) et ne quitte jamais le backend. Aucun poste — y compris celui de l’administrateur — ne possède la clé privée CA. Un poste compromis ne peut pas forger de certificats.

Périmètre par cabinet : chaque cabinet dispose de sa propre paire de clés CA. Un certificat émis pour le cabinet A est structurellement invalide pour le cabinet B. Il n’existe aucune relation de confiance inter-cabinets.

Vérification hors ligne : après l’appairage, les postes vérifient mutuellement leurs certificats en local, contre la clé publique CA mise en cache. Aucun contact avec le backend n’est requis pour l’authentification courante.

Scénario de compromission du backend — analyse de la chaîne d’exploitation complète : par souci de transparence, nous décrivons le scénario le plus défavorable et sa chaîne d’exploitation complète.

Si un attaquant parvenait à compromettre le backend (RCE, accès à l’infrastructure AWS, fuite de variables d’environnement), il pourrait extraire la clé maître CA et forger un certificat pour un cabinet ciblé. Cette hypothèse de confiance dans le backend est inhérente à toute architecture basée sur une CA — le même risque s’applique aux CA publics tels que Let’s Encrypt ou DigiCert. La clé maître est stockée dans AWS SSM (SecureString, chiffrée par KMS) et injectée au démarrage du backend ; les protections à ce niveau sont celles de l’infrastructure standard (IAM, journalisation CloudTrail), pas un HSM dédié.

Cependant, la possession d’un certificat forgé est nécessaire mais pas suffisante pour accéder aux données. La chaîne d’exploitation complète requiert l’ensemble des étapes suivantes, chacune devant aboutir :

  1. Compromission du backend — l’attaquant obtient la clé maître et le matériel cryptographique CA stocké en base de données (clé privée chiffrée, IV, auth tag), ce qui lui permet de déchiffrer la clé privée CA du cabinet ciblé et de forger un certificat pour un poste fictif.
  2. Implémentation du protocole — l’attaquant implémente un client compatible avec le protocole de pairing complet (échange de clés, génération SAS, handshake Noise KK), documenté dans le présent whitepaper.
  3. Présence physique sur le LAN du cabinet — le protocole opère exclusivement en réseau local. L’attaquant doit être physiquement dans le cabinet ou avoir compromis un équipement sur le réseau local.
  4. Initiation du pairing par l’administrateur — l’appairage n’est pas initié par le nouveau poste : c’est l’administrateur du cabinet qui déclenche la procédure depuis son poste. L’attaquant doit convaincre l’administrateur d’appairer un poste inconnu.
  5. Vérification visuelle du SAS — l’administrateur lit le code SAS affiché sur son écran et le confirme avec la personne physiquement présente devant lui. L’attaquant doit compléter cette vérification humaine sans éveiller de soupçon.

Les étapes 1 et 2, bien que non triviales, sont des attaques logicielles classiques. Ce sont les étapes 3 à 5 qui rendent l’exploitation pratiquement irréalisable : elles exigent une présence physique dans un cabinet médical de quelques personnes, une ingénierie sociale sur l’administrateur pour lui faire appairer un poste qu’il ne reconnaît pas, et une interaction face-à-face pour la vérification SAS — le tout pour accéder aux données d’un unique cabinet d’orthoptie. Ce profil d’attaque n’a aucun précédent connu dans le secteur des petites structures de santé.

La forward secrecy garantit par ailleurs que les sessions passées restent protégées indépendamment de toute compromission future de la clé CA.

4.4 Comparaison avec des précédents industriels

SystèmeModèle CAEmplacement de la cléFonctionnement hors ligne
Matter/Thread [18]Le Commissioner (poste local) signe les certificats NOCSur le poste de commissioningOui, après commissioning
Tailscale [—]Le serveur de coordination distribue les clés WireGuardServeur (ne signe pas de certificats)Partiel (repli DERP)
Signal [21]Serveur stocke les pre-keys ; pas de PKIServeur + posteOui, après échange de clés
OcureoCA backend signe les certificats postesServeur uniquement (chiffré)Oui, après appairage

Le modèle Ocureo est le plus proche de l’architecture Matter Commissioner [18], à la différence clé que la clé CA réside sur le serveur backend plutôt que sur un poste local, ce qui offre une meilleure isolation contre le vol physique.


5. Protocole d’appairage

L’appairage (pairing) est le processus par lequel un nouveau poste est enrôlé dans le domaine de confiance d’un cabinet. C’est un événement supervisé et peu fréquent (à l’installation ou au remplacement d’une machine), réalisé sous le contrôle visuel de l’administrateur.

5.1 Séquence protocolaire

Pré-condition : les deux postes se sont déjà découverts via NSD/Bonjour sur le LAN et ont établi une connexion WebSocket (en clair à ce stade — aucune session Noise KK n’existe encore).

    Nouveau poste (C)           Backend (Dokitek)           Poste admin (A)
         │                            │                           │
         │     [WebSocket LAN déjà établi via NSD]                │
         │                            │                           │
    ┌────┤                            │                           │
    │Gén.│ Paires de clés Ed25519 + X25519                        │
    └────┤                            │                           │
         │                            │                           │
         │── prepare-pairing ────────>│                           │
         │   (token auth, clés pub)   │                           │
         │                            │                           │
         │<── pairingRequestId ───────│                           │
         │    + nonce                 │                           │
         │                            │                           │
         │══ pairingRequest (WS/LAN) ════════════════════════════>│
         │   (requestId, nonce,       │                           │
         │    clés pub de C)          │              ┌────────────┤
         │                            │              │ Calcule    │
         │                            │              │ le code SAS│
    ┌────┤                            │              │ depuis les │
    │Calcule le code SAS              │              │ deux clés  │
    │depuis les deux clés pub         │              │ + nonce    │
    │+ nonce                          │              └────────────┤
    └────┤                            │                           │
         │  Affiche : [83927461]      │               ┌───────────┤
         │                            │               │ Affiche   │
         │                            │               │ [83927461]│
         │                            │               │ Admin     │
         │                            │               │ confirme  │
         │                            │               └──────────>│
         │                            │                           │
         │                            │<── confirm-pairing ───────│
         │                            │    (requestId,            │
         │                            │     clés pub de A)        │
         │                            │                           │
         │                            │── certificats ───────────>│
         │                            │   (cert C + cert A)       │
         │                            │                           │
         │<════════ Livraison du certificat (WS/LAN) ═════════════│
         │                            │                           │
    ┌────┤                            │                           │
    │Stocke certificat + clé pub CA   │                           │
    │Démarre les sessions Noise KK    │                           │
    └────┤                            │                           │

5.2 Dérivation du SAS (Short Authentication String)

Le code de vérification est dérivé par hachage cryptographique déterministe des clés publiques des deux parties et d’un nonce fourni par le serveur, suivant l’approche de channel binding établie par ZRTP [27] (RFC 6189) et le Bluetooth Secure Simple Pairing (mode Numeric Comparison). Les deux postes calculent indépendamment le même code ; toute substitution de clé publique par un intermédiaire provoque une divergence visible que l’administrateur détecte.

Résistance au brute-force : l’espace de codes offre 10^8 combinaisons. Le rate limiting et l’expiration des jetons contraignent la fenêtre d’attaque pratique.

5.3 Gossip de certificats

Après l’appairage, les postes enrôlés propagent automatiquement les certificats et les listes de révocation :

  1. À chaque handshake Noise KK, les pairs échangent l’ensemble des certificats connus et la CRL courante.
  2. Chaque certificat reçu est vérifié contre la clé publique CA avant acceptation.
  3. Un certificat forgé (non signé par la CA du cabinet) est rejeté.

Ce mécanisme gossip garantit qu’un nouveau poste enrôlé par l’administrateur est automatiquement reconnu par tous les autres postes sans nécessiter de ré-appairage individuel. Un seul appairage par poste ; propagation à l’ensemble du réseau.


6. Chiffrement de session : Noise KK

6.1 Choix du pattern

Le Noise Protocol Framework [1] définit 12 patterns de handshake interactifs fondamentaux. Nous avons retenu le pattern KK (les deux clés statiques sont connues — Known — de chaque partie) :

KK:
  -> s
  <- s
  ...
  -> e, es, ss
  <- e, ee, se
PatternAuth. mutuelleForward secrecyMessagesPrérequis
KKOuiOui2Les deux clés statiques pré-partagées
IKOuiOui2Seule la clé de l’initiateur est connue
XXOuiOui3Aucune clé pré-partagée

KK est le choix optimal pour notre cas d’usage : après l’appairage (§5), les deux postes possèdent les clés statiques certifiées de l’autre. Le pattern KK exploite cette connaissance pour atteindre l’authentification mutuelle et la forward secrecy en un minimum de messages (2), tout en rejetant les pairs inconnus dès le premier message.

6.2 Suite cryptographique

FonctionAlgorithmeTaille de cléStandardRecommandation ANSSI
Échange de clés (DH)X25519256 bitsRFC 7748 [2]Recommandé [15]
SignatureEd25519256 bitsRFC 8032 [3]Recommandé [15]
Chiffrement authentifiéChaCha20-Poly1305Clé 256 bits, nonce 96 bitsRFC 8439 [4]Recommandé [15]
Dérivation de clésHKDF-SHA256RFC 5869 [5]Recommandé [15]
Protocole de sessionNoise KKNoise spec rev. 34 [1]

Tous les algorithmes retenus sont recommandés par l’ANSSI dans le Guide de sélection d’algorithmes cryptographiques (ANSSI-PA-079) [15] et listés dans NIST SP 800-57 Part 1 [8] comme approuvés pour la protection des données sensibles.

6.3 Vérification formelle

Les propriétés de sécurité du pattern Noise KK ont été vérifiées indépendamment par plusieurs travaux académiques :

TravailMéthodePérimètreRésultat
Noise Explorer (Kobeissi et al., 2018) [12]ProVerif57 patterns Noise dont KKKK satisfait l’authentification mutuelle, la forward secrecy, l’anti-replay
Noise* (Inria, IEEE S&P 2022) [11]Assistant de preuve F*Implémentations vérifiées haute performanceImplémentation KK prouvée correcte et sécurisée
fACCE (Dowling, 2019) [13]Preuves calculatoires8 des 15 patterns de base dont KKKK sécurisé sous hypothèses standard
Spectral Analysis of Noise (Girol et al., USENIX Security 2020) [14]Analyse systématiqueTous les patterns NoiseModèle de menace maximal sous lequel KK est sécurisé

Ce sont des preuves académiques tierces portant sur la sécurité du protocole lui-même. Notre implémentation est validée contre les vecteurs de test de référence cacophony (§14), qui vérifient la conformité bit à bit avec la spécification — indépendamment de la bibliothèque cryptographique sous-jacente.

6.4 Propriétés de sécurité

Confidentialité : chaque message applicatif est chiffré avec ChaCha20-Poly1305 (AEAD). Un observateur sur le réseau ne voit que du texte chiffré.

Authentification mutuelle : les deux pairs prouvent la possession de leur clé statique attendue lors du handshake. Un imposteur ne peut pas compléter le handshake.

Forward secrecy : chaque session génère de nouvelles paires de clés X25519 éphémères. Les messages de transport bénéficient d’une forward secrecy forte — si une clé privée statique est compromise ultérieurement, les données de transport passées restent indéchiffrables. Les messages de handshake ont une forward secrecy partielle telle que spécifiée par le pattern Noise KK (voir l’analyse Noise Explorer [12]).

Intégrité : chaque message porte un tag d’authentification Poly1305. Toute modification en transit entraîne un rejet.

Anti-replay : le transport Noise utilise des compteurs de nonce séquentiels. Un message capturé et rejoué est détecté et rejeté.


7. Révocation et cycle de vie des certificats

7.1 Certificate Revocation List (CRL)

Lorsqu’un poste est retiré (remplacement de machine, vol, départ d’un collaborateur), l’administrateur le révoque. La CA backend émet une mise à jour de CRL signée :

PropriétéValeur
Signé parCA du cabinet (Ed25519)
VersionnementNuméro de séquence monotone
PropagationGossip à chaque handshake entre pairs
VérificationAvant chaque session Noise KK
PérimètrePar cabinet (aucun impact inter-cabinets)

7.2 Politique fail-close

Si un poste est isolé au-delà d’un seuil configurable sans mise à jour de CRL et sans contact avec aucun pair connu, il entre en mode fail-close : il refuse les connexions provenant de postes non déjà authentifiés dans la session courante. Cela empêche un attaquant d’exploiter l’isolation réseau pour présenter un certificat forgé.

7.3 Protection du rôle administrateur

Il n’existe pas de « poste maître » unique — tout poste opéré par un utilisateur avec le rôle administrateur peut effectuer les opérations d’enrôlement et de révocation. La protection est appliquée côté serveur : les endpoints de confirmation d’appairage et de révocation sont restreints aux utilisateurs authentifiés disposant du rôle administrateur. Un poste compromis n’ayant pas le rôle admin ne peut ni enrôler ni révoquer de pairs. Si un compte administrateur est compromis, la remédiation passe par le backend (récupération du compte, réaffectation des rôles), et non par un mécanisme au niveau du poste.

7.4 Rotation des clés

VersionMécanismePerturbation
V1 (actuelle)Manuelle : l’administrateur déclenche un ré-appairageNécessite le ré-enrôlement du poste concerné
V2 (prévue)Automatique : nouvelle paire de clés signée par la clé précédente (chaîne de confiance), cycle de 90 joursTransparente pour les utilisateurs

8. Synchronisation des données

8.1 Modèle CRDT

La synchronisation des données cliniques repose sur un modèle CRDT (Conflict-free Replicated Data Types) implémenté en interne, sans bibliothèque tierce. Ce choix garantit un contrôle total sur la couche de persistance et sa compatibilité avec le schéma de base de données existant.

L’implémentation combine deux primitives académiques :

PrimitiveRéférenceRôle
Hybrid Logical Clocks (HLC)Kulkarni, Demirbas et al. (2014) [28]Ordre causal des événements distribués
Last-Writer-Wins Register (LWW)Shapiro, Preguiça et al. (2011) [29]Résolution déterministe des conflits par ligne

Chaque enregistrement du domaine métier (patients, bilans, prescripteurs, modèles, formulations) porte une horloge logique hybride, l’identifiant du poste auteur de la dernière écriture, et un marqueur de suppression logique (tombstone). Ces métadonnées permettent à chaque poste de déterminer, de manière autonome et sans coordination centralisée, quelle version d’un enregistrement prévaut.

8.2 Protocole de synchronisation

La synchronisation entre pairs suit une séquence notification-requête-transfert, transmise exclusivement par le canal chiffré Noise KK (fail-closed) :

  1. Notification : un poste ayant accumulé des écritures locales notifie ses pairs.
  2. Requête : le pair récepteur répond par une demande de synchronisation, incluant son vecteur de connaissance (§8.3) comme contexte causal.
  3. Transfert : le poste notifiant calcule le delta minimal et le transmet de manière paginée. Le récepteur pilote la pagination jusqu’à épuisement du changeset. La pagination est tolérante aux pannes : si une interruption survient mid-transfert, la reprise au reconnect ne perd aucune donnée.
  4. Acquittement : un signal de complétion bidirectionnel garantit que les opérations post-synchronisation (propagation de certificats, réconciliation des verrous) ne démarrent qu’après convergence complète des deux pairs.

Le merge respecte l’ordre topologique (parents avant enfants) pour satisfaire les contraintes d’intégrité référentielle.

8.3 Vecteur de connaissance (Knowledge Vector)

Lorsqu’un nouveau poste rejoint le réseau, les pairs existants n’ont pas d’historique commun, ce qui forcerait un transfert complet redondant. Avec N postes, le coût serait O(N²) en volume transféré.

Le Knowledge Vector résout ce problème en implémentant un modèle delta-state formel (Almeida, Shoker et Baquero, 2018 [30]). Chaque pair maintient une carte d’état représentant, pour chaque poste d’écriture connu, l’horloge la plus récente observée. Lors d’une demande de synchronisation, le pair envoie cette carte ; le répondant calcule le delta minimal — seules les données que le demandeur n’a pas encore vues sont transmises.

Le vecteur est maintenu avec une sémantique de mise à jour monotone. En cas de défaillance — y compris une restauration de sauvegarde — la cohérence est préservée par reconstruction du vecteur à partir du jeu de données réel.

8.4 Résolution de conflits

Arbitrage LWW : lorsque deux pairs modifient le même enregistrement, l’écriture avec l’horloge la plus récente l’emporte. Les propriétés CvRDT (commutativité, associativité, idempotence) garantissent la convergence indépendamment de l’ordre de réception des messages.

Suppressions logiques (tombstones) : les suppressions sont représentées par un marqueur plutôt que par une suppression physique. Ce mécanisme est requis pour la convergence CRDT : une suppression physique serait invisible lors du merge et provoquerait la résurrection de l’enregistrement par un pair n’ayant pas encore reçu la suppression.

Déduplication par clé métier : lorsqu’un merge produit un doublon (par exemple, un même patient créé indépendamment sur deux postes), une stratégie de résolution déterministe fondée sur l’ordre des horloges garantit que les deux postes convergent vers le même résultat sans coordination.

8.5 Persistance de l’état de synchronisation

Les curseurs de synchronisation sont persistés localement par pair et avancent de manière monotone. Lors d’une restauration de sauvegarde, les curseurs sont réinitialisés pour forcer une resynchronisation complète — préservant l’intégrité des données à travers les frontières de restauration.


9. Synchronisation des fichiers

9.1 Architecture

Les fichiers associés aux bilans (exports PDF/Word, aperçus, pièces jointes) sont synchronisés via un registre CRDT dédié. Chaque entrée de fichier porte des métadonnées CRDT et un checksum d’intégrité SHA-256.

La synchronisation des fichiers progresse indépendamment de la synchronisation des données, via un espace de curseurs séparé.

9.2 Protocole de transfert

Le protocole opère en deux phases, toutes deux chiffrées via Noise KK :

Phase d’index : les pairs échangent des notifications de changement de fichiers et identifient les fichiers à transférer à partir des curseurs CRDT.

Phase de transfert : les fichiers sont transférés séquentiellement avec une vérification d’intégrité SHA-256 par fichier avant écriture sur disque.

9.3 Intégrité cross-platform

Tous les chemins relatifs stockés et échangés suivent une convention canonique unique, indépendamment de la plateforme (macOS, Windows). La normalisation est appliquée aux frontières du système de fichiers pour prévenir toute divergence cross-platform.


10. Verrouillage distribué

10.1 Modèle

Le système implémente un verrouillage pessimiste par ressource (patient, bilan, prescripteur, modèle, formulation) pour prévenir les conflits d’édition concurrente. Le premier rédacteur obtient le verrou (first-writer-wins via comparaison d’horloge logique).

Trois types de messages assurent la coordination, tous exclusivement chiffrés (fail-closed) : demande de verrouillage, libération, et état complet (envoyé à la connexion et enrichi dans les heartbeats).

10.2 Propriétés

PropriétéValeur
Timeout de connexionConfigurable — libération automatique des verrous du pair déconnecté
Filet de sécurité verrous périmésDurée maximale de maintien imposée
Surfaces de mutation gardéesToutes les opérations d’écriture dans l’interface (suppression, édition, finalisation)
Réconciliation par heartbeatPériodique — détecte et corrige l’état de verrouillage asymétrique

La réconciliation par heartbeat est un mécanisme de défense en profondeur : les pairs échangent périodiquement un résumé de l’état de verrouillage et corrigent toute divergence causée par des messages de coordination perdus lors de déconnexions transitoires.


11. Isolation sauvegarde/restauration

La sauvegarde et la restauration sont des opérations exclusives qui remplacent le jeu de données local. La couche de synchronisation complète (découverte, connexions, données, fichiers, verrous) est arrêtée pendant toute la durée de l’opération pour prévenir la propagation d’état intermédiaire ou les effets de bord en cascade. Les pairs observent une déconnexion propre. La synchronisation est redémarrée systématiquement à la fin de l’opération, et les pairs se reconnectent pour une resynchronisation propre.


12. Périmètre des données : ce que voit le serveur

DonnéeTransite par le serveur ?Finalité
Dossiers patients, bilans, fichiersNon — pair-à-pair, chiffré
Clés de session (éphémères)Non — ne quittent jamais la RAM
Clés publiques des postesOui — à l’appairage uniquementSignature de certificat
Clé privée CAOui — chiffrée au reposOpérations CA
CRLOui — signée, publique par naturePropagation des révocations
Curseurs de synchronisationNon — LAN uniquement, chiffréSuivi de progression sync (SQLite local)
Vecteurs de connaissanceNon — LAN uniquement, chiffréDelta-state sync (SQLite local)
État des verrousNon — LAN uniquement, chiffréCoordination des accès (mémoire, non persisté)
Index des fichiers (chemins + HLC)Non — LAN uniquement, chiffréRegistre de fichiers sync (SQLite local)
Noms des postesPartiellement — NSD sur LAN + backend (enregistrement device)Identification visuelle des postes

Le serveur est un tiers de confiance pour l’identité — il certifie quels postes appartiennent à quel cabinet. Il n’est pas un intermédiaire de données. Il ne voit, ne traite ni ne stocke aucune donnée clinique. Cette séparation est imposée architecturalement : le plan de données opère exclusivement sur le LAN, et le backend ne dispose d’aucun endpoint API qui accepte ou retourne des données cliniques.


13. Conformité réglementaire

13.1 Correspondance RGPD

ArticleExigenceImplémentation
Art. 5.1.fIntégrité et confidentialitéAEAD Noise KK, forward secrecy, anti-replay
Art. 25Protection des données dès la conception et par défautSécurité conçue avant l’implémentation (4 audits de conception) ; aucun mode dégradé
Art. 32.1.aChiffrement des données personnellesChiffrement de bout en bout sur tous les canaux de synchronisation
Art. 32.1.bConfidentialité, intégrité, disponibilité continuesRévocation CRL, fail-close, propagation par gossip
Art. 32.1.dTests et évaluations réguliersVecteurs de test cacophony, audits de sécurité
Art. 9Catégories spéciales (données de santé)Données ne quittant jamais le réseau local ; aucun traitement côté serveur

13.2 Correspondance avec les contrôles de l’Annexe A ISO/IEC 27001:2022

ContrôleTitreImplémentation
A.5.15Contrôle d’accèsSéparation des rôles : administrateur (appairage, révocation) vs. membre (sync). Appliqué côté serveur sur chaque appel API
A.5.28Collecte de preuvesJournalisation des événements de sécurité : tentatives d’appairage, échecs de handshake, révocations, détections de replay
A.8.9Gestion de configurationMatériel cryptographique géré centralement (CA backend) ; configuration des postes via stockage sécurisé
A.8.10Suppression des informationsLa révocation d’un poste déclenche une mise à jour CRL ; matériel cryptographique détruit à la révocation
A.8.24Utilisation de la cryptographieSélection des algorithmes per ANSSI-PA-079 [15] et NIST SP 800-57 [8] ; pas de cryptographie personnalisée ; framework Noise KK
A.8.25Cycle de vie de développement sécurisé4 audits de sécurité en phase de conception ; vérification formelle citée ; validation par vecteurs de test
A.8.26Exigences de sécurité applicativeFail-hard en cas d’indisponibilité du stockage sécurisé ; aucun repli en clair ; rate limiting sur l’appairage

Note : Ocureo n’est pas certifié ISO 27001. Cette correspondance documente l’alignement de l’architecture cryptographique avec les contrôles pertinents de l’Annexe A. La certification ISO 27001 est un processus organisationnel qui dépasse les seules mesures techniques.

13.3 Conformité ANSSI

Tous les algorithmes cryptographiques individuels utilisés sont recommandés par l’ANSSI dans le Guide de sélection d’algorithmes cryptographiques (ANSSI-PA-079, 2021) [15] :

  • Ed25519 : recommandé pour les signatures numériques
  • X25519 : recommandé pour l’accord de clés
  • ChaCha20-Poly1305 : recommandé pour le chiffrement authentifié
  • SHA-256 / HKDF : recommandé pour le hachage et la dérivation de clés

Le Noise Protocol Framework en tant que tel n’a pas été évalué par l’ANSSI ; ses propriétés de sécurité reposent sur des preuves académiques indépendantes [11][12][13][14].

13.4 HDS (Hébergement de Données de Santé)

La certification HDS (réglementation française sur l’hébergement de données de santé, Décret n° 2018-137) s’applique aux organisations qui hébergent des données de santé pour le compte d’un professionnel de santé. Dans l’architecture Ocureo, les données cliniques ne quittent jamais le réseau local et ne sont jamais hébergées sur les serveurs Dokitek. La certification HDS n’est donc pas requise pour la fonctionnalité de synchronisation. Néanmoins, les fondations architecturales (gestion des clés, contrôle d’accès, piste d’audit) sont conçues pour soutenir une trajectoire de certification HDS si le périmètre du produit venait à évoluer.


14. Validation

14.1 Conformité de l’implémentation

L’implémentation Noise KK est validée contre les vecteurs de test de référence cacophony — la suite de tests standard pour les implémentations du Noise Protocol. Chaque test injecte des clés connues, exécute le handshake et 4 messages de transport, et vérifie que chaque octet en sortie correspond aux valeurs attendues, bit à bit. C’est le test de conformité le plus strict disponible pour les implémentations du Noise Protocol.

Les vecteurs de test sont maintenus par la communauté Noise Protocol et utilisés par les implémentations de référence en Haskell, Rust et Go. Passer ces vecteurs confirme que notre implémentation suit correctement la spécification Noise KK [1].

14.2 Audits de sécurité

Quatre audits de sécurité ont été conduits pendant les phases de conception et d’implémentation :

AuditPhasePérimètreRésultatsRésolution
V1 — Revue de la pile cryptographiquePré-implémentationSélection des algorithmes, modèle de menace2 Haute, 4 Moyenne, 3 Faible, 2 InfoToutes les Haute/Moyenne résolues. Recommandation d’adopter Noise KK appliquée.
V2 — Revue de la chaîne de confiancePré-implémentationArchitecture CA, protocole d’appairage, séquencement des phases2 Haute, 6 Moyenne, 3 Faible, 3 InfoToutes les Haute résolues. Phase sécurité réordonnée avant la phase données.
V3 — Revue post-implémentationAprès développementConformité à la conception, problèmes au niveau du codeFindings de sévérité critiqueTous résolus en moins de 24 heures.
V4 — Migration cryptographiquePost-implémentationMigration vers une bibliothèque cryptographique auditée et largement déployée (libsodium)1 Haute (dépendance mono-auteur)Résolue. Couche d’abstraction découplant le code protocolaire de l’implémentation cryptographique. Conformité revalidée via les vecteurs cacophony.

14.3 Protections contre les CVE

Classe de vulnérabilitéProtection
Incrément du nonce en cas d’échec de déchiffrement (cf. CVE-2024-58265 dans la bibliothèque Rust snow)Le compteur n’avance pas en cas d’échec de déchiffrement ; cette classe de vulnérabilité est traitée par conception
Attaque par point neutre (X25519)Clés publiques nulles rejetées au handshake
Attaque par rétrogradation (repli en clair)Aucun mode dégradé — chiffrement ou absence de connexion
Épuisement du noncePlafond vérifié avant chaque opération de chiffrement

15. Limites connues

Transparence sur les limites actuelles de l’architecture :

LimiteImpactAtténuationRésolution prévue
Pas de rotation automatique des clés (V1)Clés statiques à longue durée de vie : fenêtre d’exposition élargie en cas de compromissionLa forward secrecy limite l’impact aux métadonnées ; ré-appairage disponibleV2 : rotation automatique avec chaîne de confiance
Pas de HSM pour la clé maîtreClé maître dans AWS SSM (protégée par KMS), pas dans un HSM dédiéKMS fournit un chiffrement par enveloppe et une journalisation des accès ; acceptable pour le profil de risque des petits cabinetsCoût prohibitif ; à réévaluer si le produit évolue vers le segment hospitalier
Bindings mono-auteur vers la bibliothèque cryptographiqueLes bindings vers la bibliothèque cryptographique sont maintenus par un auteur uniqueRisque atténué : (1) le cœur cryptographique (libsodium) est un projet multi-contributeurs, audité, utilisé par Signal, 1Password, Cloudflare ; (2) les bindings sont mécaniquement simples et forkables ; (3) une couche d’abstraction découple le code protocolaire de l’implémentationLe point de défaillance unique porte sur la couche de bindings, non sur l’implémentation cryptographique
Internet requis pour l’appairageEnrôlement d’un nouveau poste impossible lors d’une indisponibilité backendLes sessions existantes continuent sur le LAN ; l’indisponibilité n’affecte que l’enrôlementContrainte architecturale du modèle CA-backend
Identifiant de poste visible sur le LANLes identifiants de postes sont visibles lors de la découverte réseau locale. Aucun accès aux données n’est possible à partir de cette information seuleMitigation prévue : identifiants dérivés remplaçant les valeurs directes dans les enregistrements de découvertePost-v1
Pas de garbage collection des tombstones CRDTLes enregistrements soft-deleted (is_deleted = 1) s’accumulent indéfinimentImpact marginal sur les volumes actuels (quelques milliers de lignes)Compaction prévue en post-v1
Orphelin de session file syncSi un pair déconnecte mid-transfert, les sessions dépendantes peuvent se bloquer jusqu’à la reconnexionRécupération automatique à la reconnexion : l’état de synchronisation n’a pas avancé, le transfert reprend proprementTimeout de session à évaluer en post-v1

16. État de l’art

SystèmeChiffrementModèle d’identitéCoûtDifférence clé avec Ocureo
Doctolib (via acquisition Tanker)E2E partiel (échange de documents)PKI (Tanker SDK)135-149 EUR/moisCapacité acquise (~25-30 M EUR). Couvre l’échange de documents, pas la synchronisation complète.
Matter/Thread [18]Sessions AES-128-CCMLe Commissioner signe les certificats NOC— (standard IoT)Le Commissioner est un poste local ; clé CA sur un équipement (isolation plus faible).
TailscaleWireGuard (Noise IK)Serveur de coordination distribue les clés5-18 $/utilisateur/moisPas de signature de certificats ; clés distribuées, non certifiées.
SyncthingTLS 1.3Identifiants de postes (auto-signés), Introducer pour la propagation de confianceGratuit (open source)Pas de CA centralisée ; modèle TOFU ; l’Introducer est consultatif, pas autoritatif.
SignalX3DH + Double Ratchet (basé sur Noise)Serveur de pre-keys + safety numbersGratuitPas de PKI ; TOFU + vérification par QR code. Modèle de menace différent (global, asynchrone).
OcureoNoise KK (E2E complet)CA backend signe les certificats des postes~20 EUR/moisClé CA côté serveur (isolation maximale) ; vérification hors ligne ; inclus dans l’abonnement de base.

Ocureo utilise le même framework cryptographique que Signal et WireGuard (Noise Protocol), mais dans un pattern différent (KK vs. IK/XX) optimisé pour un réseau fermé et pré-authentifié où les clés statiques de tous les participants sont certifiées par une autorité commune. L’architecture n’est pas comparable à celle de Signal, qui résout un problème fondamentalement différent (messagerie asynchrone entre inconnus) nécessitant des propriétés supplémentaires (post-compromise security, deniability cryptographique) hors du périmètre de Noise KK.


17. References

Specifications and Standards

#DocumentReference
[1]Noise Protocol Framework, Revision 34noiseprotocol.org/noise.html
[2]RFC 7748 — Elliptic Curves for Security (X25519)rfc-editor.org/rfc/rfc7748
[3]RFC 8032 — Edwards-Curve Digital Signature Algorithm (Ed25519)rfc-editor.org/rfc/rfc8032
[4]RFC 8439 — ChaCha20 and Poly1305 for IETF Protocolsrfc-editor.org/rfc/rfc8439
[5]RFC 5869 — HMAC-based Extract-and-Expand KDF (HKDF)rfc-editor.org/rfc/rfc5869
[6]RFC 5280 — Internet X.509 PKI Certificate and CRL Profilerfc-editor.org/rfc/rfc5280
[27]RFC 6189 — ZRTP: Media Path Key Agreement for Unicast Secure RTPrfc-editor.org/rfc/rfc6189

NIST Publications

#DocumentReference
[7]NIST SP 800-207 — Zero Trust Architecturecsrc.nist.gov/pubs/sp/800/207/final
[8]NIST SP 800-57 Part 1 Rev. 5 — Recommendation for Key Managementcsrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final
[9]NIST SP 800-57 Part 2 Rev. 1 — Best Practices for Key Management Organizationscsrc.nist.gov/publications/detail/sp/800-57-part-2/rev-1/final

Academic Publications (Formal Verification of Noise Protocol)

#DocumentReference
[11]Noise* — A Library of Verified High-Performance Secure Channel Protocol Implementations (IEEE S&P 2022, Inria)eprint.iacr.org/2022/607
[12]Noise Explorer — Fully Automated Modeling and Verification for Arbitrary Noise Protocols (Kobeissi et al., 2018)eprint.iacr.org/2018/766
[13]Flexible Authenticated and Confidential Channel Establishment (fACCE): Analyzing the Noise Protocol Framework (Dowling, 2019)eprint.iacr.org/2019/436
[14]A Spectral Analysis of Noise: A Comprehensive, Automated, Formal Analysis of Diffie-Hellman Protocols (Girol et al., USENIX Security 2020)usenix.org/system/files/sec20-girol_0.pdf

CRDT and Distributed Systems

#DocumentReference
[28]Kulkarni, S., Demirbas, M., Madappa, D., Avva, B., Leone, M. “Logical Physical Clocks and Consistent Snapshots in Globally Distributed Databases.” 2014.cse.buffalo.edu/tech-reports/2014-04.pdf
[29]Shapiro, M., Preguiça, N., Baquero, C., Zawirski, M. “A comprehensive study of Convergent and Commutative Replicated Data Types.” INRIA Research Report RR-7506, 2011.inria.hal.science/inria-00555588
[30]Almeida, P.S., Shoker, A., Baquero, C. “Delta State Replicated Data Types.” Journal of Parallel and Distributed Computing, 111, 2018.doi.org/10.1016/j.jpdc.2017.08.003

ANSSI / Réglementation française

#DocumentReference
[15]ANSSI-PA-079 — Guide de sélection d’algorithmes cryptographiques (2021)cyber.gouv.fr/publications/mecanismes-cryptographiques
[16]RGS v2.0 — Référentiel Général de Sécuritécyber.gouv.fr/le-referentiel-general-de-securite-version-20-les-documents

Industry References

#DocumentReference
[18]Matter Security & Privacy Fundamentals (CSA, 2022)csa-iot.org
[21]Signal X3DH Specificationsignal.org/docs/specifications/x3dh/

Regulatory

#DocumentReference
[22]ISO/IEC 27001:2022 — Information Security Management Systemsiso.org/standard/27001
[23]ISO/IEC 27002:2022 — Information Security Controlsiso.org/standard/75652.html
[26]RGPD — Règlement (UE) 2016/679eur-lex.europa.eu

Dokitek SARL, mars 2026. Ce document décrit l'architecture cryptographique implémentée au 23 mars 2026. Il ne constitue ni une certification ni un engagement contractuel.