Aller au contenu

PD-24 — Plan d'implémentation


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

Objectif

Implémenter la Phase 1 du protocole SRP-6a (Secure Remote Password) pour une authentification strictement Zero-Knowledge.

Choix techniques retenus

  • Protocole : SRP-6a (RFC 5054)
  • Groupe : Safe Prime 3072 bits
  • Hash : SHA3-256 (Keccak)
  • Session : Store en mémoire avec TTL

Architecture ciblée

src/modules/auth/
├── auth.controller.ts          # Endpoints /auth/*
├── auth.service.ts             # Orchestration
├── services/
│   ├── srp.service.ts          # Calculs SRP-6a
│   └── srp-session-store.ts    # Sessions éphémères
└── dto/
    ├── register.dto.ts         # {email, salt, verifier}
    ├── login-challenge.dto.ts  # {email, A}
    └── login-verify.dto.ts     # {M1}

Découpage technique

Phase 1 : Paramètres SRP

  1. Définir groupe 3072 bits (N, g) depuis RFC 5054
  2. Calculer k = SHA3-256(N || PAD(g))
  3. Implémenter modPow(base, exp, mod) pour BigInt
  4. Implémenter hash(...values) avec padding

Phase 2 : Inscription

  1. Endpoint POST /auth/register :
  2. Recevoir {email, salt, verifier, plan}
  3. Valider salt (16-32 bytes hex)
  4. Valider verifier ∈ [1, N-1]
  5. Stocker en DB (JAMAIS le password)

  6. Implémenter validateClientRegistration(salt, verifier)

Phase 3 : Challenge (Phase 1 SRP)

  1. Endpoint POST /auth/login/challenge :
  2. Recevoir {email, A}
  3. Valider A mod N ≠ 0
  4. Récupérer {salt, verifier} du user
  5. Générer b aléatoire (256 bits)
  6. Calculer B = (k*v + g^b) mod N
  7. Stocker session {A, b, B, v}
  8. Retourner {salt, B}

  9. Implémenter generateServerEphemeral(verifier)

  10. Implémenter validateClientEphemeral(A)

Phase 4 : Session Store

  1. Créer SrpSessionStoreService :
  2. Map en mémoire avec TTL 5 minutes
  3. Clé : email
  4. Valeur : {A, b, B, v, createdAt}
  5. Nettoyage périodique sessions expirées

Phase 5 : Vérification (préparation Phase 2)

  1. Calculer u = SHA3-256(PAD(A) || PAD(B))
  2. Valider u ≠ 0
  3. Implémenter computeU(A, B)

Phase 6 : Sécurité

  1. Rate limiting sur /auth/login/challenge
  2. Délai aléatoire (timing attack protection)
  3. Logs sans données sensibles
  4. Validation stricte tous paramètres

Phase 7 : Tests

  1. Tests vecteurs RFC 5054
  2. Tests validation A = 0 attack
  3. Tests session expiration
  4. Tests isolation utilisateurs

Points de vigilance

  • BigInt : Attention overflow, utiliser BigInt natif
  • Padding : Toujours padder à la taille du groupe
  • A = 0 : CRITIQUE, rejeter immédiatement
  • Session : Usage unique, supprimer après verify

Hors périmètre

  • Phase 2 SRP (calcul S, M1, M2) → PD-25
  • Génération JWT → PD-25
  • MFA → future US