Skip to content
StableAudienceDevSécuritéAudit banqueOwner@platform-teamDernière revue2026-05-21

Package @nex/mobile-auth

Couche d'authentification locale partagée par les 3 apps mobiles Nex / Nex Pro / Nex Business. Gère le PIN local (vault chiffré), la biométrie (Face ID / empreinte), le verrouillage progressif et l'audit des tentatives.

Identité

AttributValeur
Package@nex/mobile-auth v1.0.0
TypeLibrary TypeScript (source brute, transpilée par Metro — pas de build step)
Sourcepackages/mobile-auth/src/
README❌ absent (cette page tient lieu de référence)
Owner@platform-team

Responsabilité

Couvre tout le plan local mobile d'authentification :

  • Stocker le PIN sous forme dérivée (PBKDF2-SHA256) dans un vault SecureStore.
  • Authentifier l'utilisateur via biométrie (Face ID / empreinte) ou PIN.
  • Appliquer un verrouillage progressif (MAX_PIN_ATTEMPTS, LOCKOUT_MS) et un lock délai configurable (LOCK_DELAY_MS, presets disponibles).
  • Bufferiser les événements d'audit (PIN_AUDIT_BUFFER_MAX) pour les expédier ultérieurement au backend.
  • Fournir des composants UI réutilisables (AppLockScreen, PinKeypad, BiometricPrompt).

Indépendant du backend d'authentification : ne fait pas d'HTTP. Reçoit les credentials d'un appelant amont (typiquement @nex/mobile-bootstrap ou le store auth de chaque app).

Architecture interne

Adapters (injection de dépendances)

Le package n'importe pas directement expo-secure-store, @react-native-async-storage/async-storage, ni les libs natives. Tout passe par des adapters injectables.

DomaineSetterGetterImplémentation par défaut
Stockage sécurisésetSecureStoragegetSecureStoragebranchée sur expo-secure-store côté apps
Stockage KVsetKvStoragegetKvStoragebranchée sur @react-native-async-storage/async-storage
CryptosetCryptoProvidergetCryptoProvidercreateRnqcProvider() (React Native Quick Crypto, JSI natif)
BiométriesetBiometricAdaptergetBiometricAdapterbranchée sur expo-local-authentication

Bénéfice : le package est testable sans device, et chaque app peut substituer une implémentation différente sans modifier le code partagé.

Services

ServiceRôle
PinVaultService (pinVault)Stocke un vault { salt, hash, iterations } en SecureStore, vérifie un PIN sans le persister en clair
BiometricService (biometricService)Wrapper sur expo-local-authentication : capabilities, prompt, fallback
LockoutStorePersiste l'état de lockout (compteur tentatives, deadline) en SecureStore
AuditBufferBufferise jusqu'à PIN_AUDIT_BUFFER_MAX tentatives PIN pour push asynchrone vers le backend

Hooks React

HookRôle
useBiometricLock(options)Orchestre déverrouillage : biométrie → fallback PIN → lockout
useAppLockConfig()Lit / écrit la config app-lock (delay, biométrie activée…)

Composants UI

AppLockScreen · AppPrivacyCover (masquage des écrans en background) · BiometricPrompt · PinKeypad · ResyncBanner (resync échec).

Crypto

ÉlémentAlgorithmeNotes
Dérivation du PINPBKDF2-SHA256iterations = PBKDF2_ITERATIONS, salt = PBKDF2_SALT_BYTES, output = PBKDF2_HASH_BYTES. Disjoint du hash bcrypt côté serveur (ADR-0013 couvre le cas QR).
Providerreact-native-quick-crypto (JSI natif)Adapter createRnqcProvider()
Stockage clésiOS Keychain / Android KeyStore via expo-secure-storeclés SECURE_KEY_PIN_VAULT, SECURE_KEY_LOCKOUT

Constantes publiques

LOCK_DELAY_MS, LOCK_DELAY_PRESETS, MAX_PIN_ATTEMPTS, LOCKOUT_MS, PBKDF2_ITERATIONS, PBKDF2_SALT_BYTES, PBKDF2_HASH_BYTES, PIN_AUDIT_BUFFER_MAX, SECURE_KEY_PIN_VAULT, SECURE_KEY_LOCKOUT, STORAGE_KEY_PIN_AUDIT_BUFFER.

Types exportés

PinVault, BiometricType, LockState, UnlockResult, BufferedPinAttempt, LockoutState.

Dépendances peers

  • react, react-native
  • expo-local-authentication, expo-secure-store
  • @react-native-async-storage/async-storage
  • @nex/ui-mobile (composants & tokens)
  • crypto-js (fallback / utilitaires)

Couverture MASVS attendue

Voir /security/mobile-security pour le mapping détaillé. Les chapitres OWASP MASVS touchés par ce package :

  • MASVS-STORAGE — vault PIN dans SecureStore, jamais en clair en mémoire prolongée.
  • MASVS-CRYPTO — PBKDF2-SHA256 via JSI natif.
  • MASVS-AUTH — biométrie + PIN avec lockout progressif.
  • MASVS-RESILIENCEAppPrivacyCover masque l'écran en background (anti-screenshot).

Pages à produire (Lot futur)

  • api.md — surface publique précise (signatures, options de chaque hook)
  • security-model.md — modèle de sécurité détaillé (threat model local, comparaison vs serveur)
  • integration-guide.md — comment intégrer dans une nouvelle app mobile

Nex — Plateforme fintech CEMAC