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_encryption → K_master_user → K_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 :
- Activer l'authentification biométrique depuis les paramètres de l'application
- Déverrouiller l'application via Face ID ou Touch ID
- Basculer automatiquement vers le mot de passe en cas d'échec ou d'indisponibilité
- Bénéficier d'une protection locale via Secure Enclave / Keychain iOS
- 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 |