Aller au contenu

PD-34 — Dérivation des clés de chiffrement (K_encryption, K_doc)


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 **Spécification** | *(ce document)* | | 🛠️ [Plan d'implémentation](PD-34-plan.md) | | | ✅ [Critères d'acceptation](PD-34-acceptability.md) | | | 📝 [Retour d'expérience](PD-34-rex.md) | | [← Retour à crypto](../PD-189-epic.md) · [↑ Index User Story](index.md)

Références

  • EPIC : PD-189 — CRYPTO
  • JIRA : PD-34
  • Composants concernés : client (mobile / desktop / PWA)

Objectif

Mettre en œuvre le mécanisme de dérivation cryptographique des clés utilisées dans le modèle zero-knowledge de ProbatioVault, afin de garantir :

  • la séparation stricte des responsabilités cryptographiques ;
  • l'unicité des clés par document ;
  • la possibilité de changer le mot de passe utilisateur sans re-chiffrer les documents stockés en WORM.

Cette User Story établit le socle cryptographique sur lequel reposent le chiffrement des documents, la rotation des clés et la gestion multi-device.

Description fonctionnelle

Le système doit implémenter une hiérarchie de dérivation de clés permettant de produire, à partir du mot de passe utilisateur, des clés cryptographiquement isolées et déterministes.

La dérivation suit les niveaux suivants :

  • Niveau 2A — K_encryption Clé dérivée du mot de passe utilisateur, utilisée exclusivement pour chiffrer et déchiffrer l'enveloppe maître contenant la clé maître utilisateur.

  • Niveau 3 — K_master_user Clé maître utilisateur, générée aléatoirement, unique pour toute la durée de vie du compte, et servant de source à toutes les clés documentaires.

  • Niveau 4 — K_doc Clé spécifique à un document, dérivée de manière déterministe à partir de K_master_user et de l'identifiant du document.

Chaque document doit disposer d'une clé indépendante, de sorte que la compromission d'un élément n'affecte jamais les autres.

Périmètre

Inclus

  • Dérivation de K_encryption à partir du mot de passe utilisateur.
  • Dérivation de K_doc à partir de K_master_user et d'un identifiant de document.
  • Implémentation d'un mécanisme de dérivation standardisé et auditable.
  • Garanties d'isolation cryptographique entre documents.
  • Tests de conformité, de performance et de déterminisme.
  • Documentation de la hiérarchie de clés et des paramètres cryptographiques.

Exclu

  • Chiffrement ou déchiffrement des documents.
  • Gestion des enveloppes de clés (traitée dans PD-35).
  • Stockage persistant des clés.
  • Authentification utilisateur.
  • Gestion HSM ou signature probatoire.
  • Interface utilisateur.

Paramètres cryptographiques normatifs

Dérivation K_doc (HKDF-SHA3-256)

Paramètre Valeur
Algorithme HKDF avec SHA3-256
RFC RFC 5869
IKM K_master_user (32 bytes)
Salt UUID document converti en 16 bytes
Info "ProbatioVault::K_doc::v1" (domain separation)
Output 32 bytes (256 bits)

Hiérarchie des clés

Password utilisateur
    ↓ Argon2id (PD-33)
K_encryption
    ↓ AES-256-GCM decrypt
K_master_user
    ↓ HKDF-SHA3-256(doc_id)
K_doc (unique par document)

Diagrammes

Sequence de derivation des cles

Le diagramme suivant illustre le flux complet de derivation, depuis le mot de passe utilisateur jusqu'a la cle documentaire K_doc. Chaque etape respecte l'isolation zero-knowledge : aucune cle intermediaire ne quitte l'appareil client.

sequenceDiagram
    participant U as Utilisateur
    participant C as Client (app)
    participant KS as Keychain / SecureStore

    Note over U,C: Saisie du mot de passe (reste local — zero-knowledge)

    U->>C: password

    rect rgb(240, 248, 255)
        Note over C: Niveau 2A — K_encryption
        C->>C: Argon2id(password, salt_user)<br/>→ K_encryption (32 bytes)<br/>(PD-33, RFC 9106)
    end

    rect rgb(245, 255, 245)
        Note over C: Niveau 3 — K_master_user
        C->>KS: recuperer master_envelope
        KS-->>C: master_envelope (chiffree)
        C->>C: AES-256-GCM decrypt(K_encryption, master_envelope)<br/>→ K_master_user (32 bytes)
    end

    rect rgb(255, 248, 240)
        Note over C: Niveau 4 — K_doc (unicite par document)
        C->>C: UUID doc_id → 16 bytes (salt)
        C->>C: HKDF-SHA3-256(<br/>  IKM = K_master_user,<br/>  salt = doc_id_bytes,<br/>  info = "ProbatioVault::K_doc::v1"<br/>)<br/>→ K_doc (32 bytes)<br/>(RFC 5869)
    end

    Note over C: K_doc prete pour chiffrement/dechiffrement document
    Note over C: K_encryption et K_master_user<br/>doivent etre effacees (zeroize)<br/>apres usage

Diagramme d'etats du cycle de vie d'une cle

Le diagramme d'etats ci-dessous modelise les transitions possibles pour une cle dans la hierarchie de derivation. Les contraintes zero-knowledge et d'effacement memoire sont materialisees par les etats terminaux.

stateDiagram-v2
    [*] --> NonDerivee : init

    state "Non derivee" as NonDerivee
    state "En derivation" as EnDerivation
    state "Active en memoire" as Active
    state "Utilisee" as Utilisee
    state "Effacee (zeroize)" as Effacee

    NonDerivee --> EnDerivation : password saisi (K_encryption)<br/>ou master_envelope dechiffree (K_master_user)<br/>ou doc_id fourni (K_doc)

    EnDerivation --> Active : derivation reussie<br/>(Argon2id / AES-256-GCM / HKDF)
    EnDerivation --> Effacee : echec derivation<br/>(erreur crypto, mauvais password)

    Active --> Utilisee : operation crypto executee<br/>(chiffrement / dechiffrement)
    Active --> Effacee : timeout securite<br/>ou fermeture session

    Utilisee --> Effacee : effacement obligatoire<br/>apres usage (cles intermediaires)<br/>— isolation zero-knowledge
    Utilisee --> Active : reutilisation autorisee<br/>(K_doc pour meme document,<br/>K_master_user pour session active)

    Effacee --> [*]

    note right of Active
        Cle jamais transmise au backend
        Cle jamais loggee
        Cle jamais persistee hors SecureStore
    end note

    note right of Effacee
        Memoire mise a zero (zeroize)
        Determinisme cross-platform garanti
    end note

Contraintes

  • Zero-Knowledge
  • Le mot de passe utilisateur ne doit jamais quitter l'appareil.
  • Les clés dérivées ne doivent jamais être transmises au backend en clair.
  • Aucune clé ne doit être loggée ou persistée hors des mécanismes autorisés.

  • Conformité cryptographique

  • Utilisation d'algorithmes standardisés et reconnus.
  • Paramètres de dérivation alignés avec les recommandations actuelles.
  • Séparation des usages via des mécanismes de domain separation.
  • UUID documents au format standard (36 chars) converti en 16 bytes pour le salt.

  • Performance

  • La dérivation doit rester compatible avec un usage mobile.
  • Les temps de calcul doivent rester acceptables sans compromettre la sécurité.

  • Interopérabilité

  • Les résultats de dérivation doivent être strictement déterministes.
  • Les implémentations doivent produire les mêmes résultats sur toutes les plateformes supportées.

Hypothèses

  • Un salt utilisateur unique est disponible pour la dérivation du mot de passe.
  • L'identifiant de document est unique et stable dans le temps.
  • K_master_user est déjà générée et disponible en mémoire sécurisée.
  • Les primitives cryptographiques sous-jacentes sont fiables et correctement implémentées par les bibliothèques utilisées.
  • Les opérations de chiffrement sont prises en charge par d'autres modules.

Liens documentaires

  • EPIC :
  • PD-189 — CRYPTO
  • Architecture :
  • Architecture Cryptographique — Hiérarchie des clés
  • Sécurité :
  • RFC 9106 — Argon2
  • RFC 5869 — HKDF
  • Spécifications ProbatioVault — Zero-Knowledge Model