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¶
- Définir groupe 3072 bits (N, g) depuis RFC 5054
- Calculer k = SHA3-256(N || PAD(g))
- Implémenter
modPow(base, exp, mod)pour BigInt - Implémenter
hash(...values)avec padding
Phase 2 : Inscription¶
- Endpoint
POST /auth/register: - Recevoir {email, salt, verifier, plan}
- Valider salt (16-32 bytes hex)
- Valider verifier ∈ [1, N-1]
-
Stocker en DB (JAMAIS le password)
-
Implémenter
validateClientRegistration(salt, verifier)
Phase 3 : Challenge (Phase 1 SRP)¶
- Endpoint
POST /auth/login/challenge: - Recevoir {email, A}
- Valider A mod N ≠ 0
- Récupérer {salt, verifier} du user
- Générer b aléatoire (256 bits)
- Calculer B = (k*v + g^b) mod N
- Stocker session {A, b, B, v}
-
Retourner {salt, B}
-
Implémenter
generateServerEphemeral(verifier) - Implémenter
validateClientEphemeral(A)
Phase 4 : Session Store¶
- Créer
SrpSessionStoreService: - Map en mémoire avec TTL 5 minutes
- Clé : email
- Valeur : {A, b, B, v, createdAt}
- Nettoyage périodique sessions expirées
Phase 5 : Vérification (préparation Phase 2)¶
- Calculer u = SHA3-256(PAD(A) || PAD(B))
- Valider u ≠ 0
- Implémenter
computeU(A, B)
Phase 6 : Sécurité¶
- Rate limiting sur /auth/login/challenge
- Délai aléatoire (timing attack protection)
- Logs sans données sensibles
- Validation stricte tous paramètres
Phase 7 : Tests¶
- Tests vecteurs RFC 5054
- Tests validation A = 0 attack
- Tests session expiration
- 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