Aller au contenu

PD-107 — Expression de Besoin : Authentification Biométrique iOS

Version : 1.0 Date : 2026-02-14 Auteur : Claude (Orchestrateur) Validation PO : Validé (2026-02-14)


1. Contexte

ProbatioVault repose sur une architecture Zero-Knowledge avec chiffrement local, hiérarchie de clés (K_encryptionK_master_userK_doc) et stockage sécurisé des enveloppes dans un HSM isolé.

L'application iOS constitue un point d'accès critique au coffre-fort probatoire. Elle doit concilier : - Sécurité maximale — aucune clé en clair, Secure Enclave - Expérience utilisateur fluide — déverrouillage < 1 seconde - Conformité probatoire — journalisation auditable, NF Z42-013 compatible

L'authentification biométrique (Face ID / Touch ID) permet un déverrouillage rapide sans compromettre les garanties Zero-Knowledge ni contourner le modèle cryptographique décrit dans l'architecture globale.


2. Problème à Résoudre

Actuellement, l'utilisateur doit saisir son mot de passe à chaque ouverture de l'application. Cela crée une friction qui : - Décourage l'usage fréquent de l'application - Réduit l'adoption B2C par rapport aux concurrents - Expose le mot de passe à des observations (shoulder surfing)

Besoin utilisateur : Pouvoir déverrouiller l'application rapidement avec Face ID / Touch ID tout en conservant un niveau de sécurité bancaire.


3. Objectif Fonctionnel

Permettre à un utilisateur iOS de :

  1. Activer l'authentification biométrique depuis les paramètres de l'application
  2. Déverrouiller l'application via Face ID ou Touch ID
  3. Basculer automatiquement vers le mot de passe en cas d'échec ou d'indisponibilité
  4. Bénéficier d'une protection locale via Secure Enclave / Keychain iOS
  5. Tracer chaque authentification de manière probatoire

4. Périmètre

4.1 Inclus

Fonctionnalité Description
Activation/désactivation Toggle dans les paramètres app, après confirmation mot de passe
Déverrouillage biométrique Face ID et Touch ID selon le device
Fallback mot de passe Toujours disponible, obligatoire dans certains cas
Keychain sécurisé Stockage des secrets avec protection biometric-gated
Secure Enclave Protection matérielle des clés locales
Journalisation probatoire Logs append-only, horodatés, signés backend
Gestion échecs répétés Après 3 échecs → mot de passe obligatoire
Détection modification biométrique Révocation automatique si empreinte/visage système modifié

4.2 Exclu

Hors périmètre Raison
Android Story séparée
FIDO2 / YubiKey Backlog dédié
Biométrie web/PWA Architecture différente
MFA distant Traité dans PD-182 AUTH

5. Exigences Fonctionnelles

5.1 Activation de la Biométrie

Prérequis : - Utilisateur authentifié (session active) - Biométrie disponible sur le device (Face ID ou Touch ID configuré)

Flux : 1. L'utilisateur accède à Paramètres > Sécurité > Authentification biométrique 2. Il active le toggle "Utiliser Face ID / Touch ID" 3. L'application demande la confirmation du mot de passe 4. L'application affiche les implications de sécurité : - "La biométrie facilite le déverrouillage mais ne remplace pas votre mot de passe" - "En cas de modification de vos empreintes système, vous devrez ressaisir votre mot de passe" 5. L'application génère et stocke une clé dérivée protégée par biométrie dans le Keychain 6. Confirmation visuelle de l'activation

Contraintes : - Le mot de passe ne doit jamais être stocké en clair - La clé stockée est une clé intermédiaire (pas K_encryption directement)

5.2 Déverrouillage

Flux nominal : 1. L'utilisateur ouvre l'application 2. Si biométrie activée ET disponible → prompt Face ID / Touch ID 3. Si succès biométrique : - Récupération de la clé intermédiaire depuis le Keychain - Dérivation de K_encryption en mémoire - Accès au coffre-fort - Log : BIOMETRIC_AUTH_SUCCESS 4. Temps de déverrouillage cible : < 1 seconde

Flux alternatif (échec biométrique) : 1. Échec biométrique (non reconnaissance) 2. Compteur d'échecs incrémenté 3. Si compteur < 3 → nouvelle tentative possible + option mot de passe 4. Si compteur >= 3 → mot de passe obligatoire 5. Log : BIOMETRIC_AUTH_FAILURE avec nombre de tentatives

Flux alternatif (utilisateur choisit mot de passe) : 1. L'utilisateur tape sur "Utiliser le mot de passe" 2. Formulaire de saisie classique 3. Authentification SRP-6a standard 4. Log : PASSWORD_AUTH_FALLBACK

5.3 Fallback Obligatoire

Le mot de passe est exigé dans les situations suivantes :

Situation Comportement
Biométrie indisponible Prompt mot de passe direct
Biométrie modifiée (nouvel empreinte/visage) Révocation + mot de passe obligatoire
Application réinstallée Mot de passe + réactivation manuelle biométrie
Device redémarré Mot de passe obligatoire (première auth post-boot)
Inactivité > 30 minutes Mot de passe obligatoire
3 échecs biométriques consécutifs Mot de passe obligatoire
Changement de mot de passe Biométrie révoquée, réactivation manuelle

5.4 Keychain et Secure Enclave

Stockage : - La clé intermédiaire est stockée dans le Keychain iOS - Protection : kSecAccessControlBiometryCurrentSet (invalide si biométrie modifiée) - Accessibility : kSecAttrAccessibleWhenUnlockedThisDeviceOnly

Secure Enclave : - Utilisée pour protéger l'accès au Keychain - La clé privée SE ne quitte jamais le hardware - ProbatioVault n'a jamais accès aux données biométriques brutes

Révocation automatique : - Si LAContext.evaluatedPolicyDomainState change → clé invalidée par iOS - L'application détecte l'invalidation et force le fallback mot de passe - Log : BIOMETRIC_REVOKED_SYSTEM_CHANGE

5.5 Journalisation Probatoire

Chaque événement génère un log structuré :

Événement Champs Intégrité
BIOMETRIC_ENABLED userId, deviceId, biometryType, timestamp Signé backend
BIOMETRIC_DISABLED userId, deviceId, reason, timestamp Signé backend
BIOMETRIC_AUTH_SUCCESS userId, deviceId, timestamp, unlockDuration Signé backend
BIOMETRIC_AUTH_FAILURE userId, deviceId, attemptCount, timestamp Signé backend
BIOMETRIC_REVOKED_SYSTEM_CHANGE userId, deviceId, timestamp Signé backend
PASSWORD_AUTH_FALLBACK userId, deviceId, reason, timestamp Signé backend

Propriétés : - Append-only (pas de modification/suppression) - Horodatage serveur (UTC ISO 8601) - Signature HSM pour non-répudiation - Compatible NF Z42-013 et Preuve Composite Ancrée


6. Exigences de Sécurité

6.1 Invariants Non Négociables

# Invariant Impact si violé
INV-107-01 La biométrie ne remplace PAS le mot de passe cryptographique Rupture Zero-Knowledge
INV-107-02 La biométrie ne dérive JAMAIS K_encryption directement Exposition clé maître
INV-107-03 Elle sert uniquement à déverrouiller un secret déjà encapsulé Architecture compromise
INV-107-04 Aucun bypass SRP-6a n'est autorisé Authentification faible
INV-107-05 Aucune clé brute persistée en clair Exfiltration possible
INV-107-06 Les données biométriques brutes ne sont JAMAIS collectées Violation RGPD

6.2 Cas à Risque à Couvrir

Menace Mitigation
Téléphone volé déverrouillé Timeout 30 min → mot de passe obligatoire
Modification biométrie par attaquant kSecAccessControlBiometryCurrentSet → révocation auto
Jailbreak Détection optionnelle (non bloquante MVP, log)
Dump mémoire K_encryption en mémoire uniquement pendant session, zéroisation
Replay local Nonce dans protocole d'authentification backend
App background capture Blur screen en background, pas de secrets visibles

7. Contraintes UX

Contrainte Valeur cible
Temps de déverrouillage < 1 seconde
Message d'échec Clair, actionnable
Paramètre visible Settings > Sécurité
Activation implicite Interdite (toujours explicite)
Biométrie forcée Interdite (toujours optionnelle)

8. Contraintes Réglementaires

  • RGPD : Données biométriques jamais collectées par ProbatioVault (traitement local iOS uniquement)
  • Zero-Knowledge : Aucune information permettant de déchiffrer ne quitte le device
  • NF Z42-013 : Journalisation compatible archivage probatoire
  • Souveraineté : Pas de dépendance cloud biométrique externe

9. Critères d'Acceptation

# Critère Méthode de validation
CA-107-01 Activation nécessite confirmation mot de passe Test manuel + E2E
CA-107-02 Déverrouillage Face ID/Touch ID fonctionne < 1s Test performance
CA-107-03 Fallback mot de passe toujours disponible Test manuel + E2E
CA-107-04 Après 3 échecs → mot de passe obligatoire Test E2E
CA-107-05 Modification biométrie système → révocation Test device réel
CA-107-06 Réinstallation → réactivation manuelle requise Test device réel
CA-107-07 Inactivité 30 min → mot de passe obligatoire Test E2E avec timer
CA-107-08 Changement MDP → biométrie révoquée Test E2E
CA-107-09 Aucun secret en clair dans storage Audit code + tests
CA-107-10 Journalisation complète de tous les événements Test intégration backend
CA-107-11 Pas de contournement SRP-6a Audit sécurité
CA-107-12 Logs signés et append-only Test intégration backend

10. Dépendances

Dépendance Type Story liée
Architecture Zero-Knowledge Existante PD-42 (Specs techniques)
Module crypto app Existante PD-97, PD-33
Backend logging/audit Existante PD-37 (Audit HSM)
Keychain service À créer Cette story
Biometric service À créer Cette story

11. Risques Identifiés

Risque Probabilité Impact Mitigation
Hermes (React Native) sans WebAssembly Confirmé Fort Utiliser crypto natives ou Turbo Modules
Simulateur iOS limité pour biométrie Confirmé Moyen Tests sur device physique obligatoires
Zéroisation mémoire best-effort (JS immutable) Confirmé Moyen Documenter limite, audit crypto natif

12. Point Stratégique

Cette user story est critique pour : - Adoption B2C — UX comparable aux gestionnaires de mots de passe premium - Crédibilité sécurité — Niveau bancaire mobile - Segment mineurs (PD-185) — Facilité d'accès sans compromis sécurité - Image européenne — Infrastructure de confiance souveraine

Une implémentation faible serait destructrice pour la promesse Zero-Knowledge.


Annexe : Décisions PO

Question Réponse PO Date
Timeout inactivité 30 minutes 2026-02-14
Post-changement MDP Révoquer biométrie 2026-02-14
Seuil échecs biométriques 3 échecs → MDP obligatoire 2026-02-14
Réinstallation Réactivation manuelle requise 2026-02-14