Aller au contenu

PD-35 — Rétrospective

1. Contexte

Champ Valeur
Story ID PD-35
Titre Key Wrapping AES-256-KW
Domaine crypto-proof
Projet backend
Date complétion 2026-01-XX
Verdict ACCEPTÉ AVEC RÉSERVES

2. Métriques

Métrique Valeur
Écarts majeurs 4
Points fluides 13
Points difficiles 5
Dette technique 6 items

3. Learnings clés

  • Le scaffolding "DEV ONLY" génère des écarts MAJEURS : Les guards commentés et userId hardcodés constituent des failles de sécurité. Ce pattern doit être explicitement accepté comme dette technique ou bloqué.

  • Blacklist doit respecter le modèle de données : La contrainte UNIQUE sur (user_id, device_id) implique que la query doit filtrer sur les deux colonnes. Une query sur deviceId seul crée un comportement cross-tenant.

  • Récupération nécessite route de récupération : Créer une Recovery Envelope sans exposer de route GET rend le mécanisme inutilisable via API. La spec doit préciser le flux complet.

  • Journalisation probatoire = dépendance explicite : Les TODO "audit log (PD-XX)" sans US créée garantissent que cette contrainte ne sera pas satisfaite. Créer la dépendance au backlog.

  • AES-KW Node.js crypto robuste : L'algorithme id-aes256-wrap est stable depuis Node.js v15, l'implémentation native garantit la conformité RFC 3394.

4. Patterns applicables

Pattern existant : Zeroization systématique

try {
  const unwrapped = this.aesKwService.unwrap(kek, wrappedKey);
  // Utiliser unwrapped...
  return result;
} finally {
  this.aesKwService.zeroize(kek);
  this.aesKwService.zeroize(unwrapped);
}

Nouveau pattern : Transaction atomique rotation clé

const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
  const currentK = await this.unwrap(queryRunner, oldKek);
  const newWrapped = await this.wrap(newKek, currentK);
  await queryRunner.manager.save(KeyEnvelope, newEnvelope);
  await queryRunner.commitTransaction();
} catch (error) {
  await queryRunner.rollbackTransaction();
  throw error;
} finally {
  await queryRunner.release();
}

5. Signal CLAUDE.md

Priorité haute : Interdire les scaffoldings DEV ONLY sans ticket de dette.

### Scaffolding DEV ONLY — Règle stricte (2026-02-XX)

Tout code marqué "DEV ONLY" (guards commentés, userId hardcodé, etc.) DOIT :
1. Être identifié comme écart MAJEUR dans la revue d'acceptabilité
2. Avoir un ticket de dette technique créé avec priorité HAUTE
3. Être corrigé AVANT mise en production

**Pattern interdit** : `// JwtAuthGuard: TODO DEV ONLY`

6. Conclusion

PD-35 a livré le module Key Wrapping AES-256-KW avec zeroization et transactions atomiques. Les 4 écarts majeurs (JWT désactivé, route GET recovery absente, blacklist globale, journalisation TODO) illustrent l'importance de définir les dépendances inter-US et de refuser les scaffoldings non sécurisés.


Rétrospective générée 2026-02-19 (Étape 10 batch crypto-proof)