Skip to Content
SécuritéPartie 4 — Authentification4.2 — Mots de passe & connexion

Chapitre 4.2 — Mots de passe & connexion

⏱️ TL;DR — Un flux de connexion solide, c’est plus que « comparer un mot de passe ». Côté politique : suivre les recommandations modernes (NIST) — privilégier la longueur, autoriser les phrases de passe, bannir les mots de passe compromis connus, et abandonner les règles absurdes (changement forcé tous les 90 jours, complexité type « 1 majuscule + 1 chiffre + 1 symbole »). Côté attaques : limiter le bruteforce (rate limiting, verrouillage temporisé, captcha après N échecs), contrer le credential stuffing (MFA, détection), et ne pas fuiter quels comptes existent (messages et timings uniformes). Le stockage, lui, est déjà réglé : argon2id (Partie 3).

🎯 Objectifs

  • Définir une politique de mot de passe moderne (NIST) et abandonner les mauvaises habitudes.
  • Comprendre et bloquer le bruteforce (rate limiting, verrouillage, captcha).
  • Comprendre le credential stuffing et ses parades (MFA, mots de passe compromis).
  • Éviter l’énumération de comptes (messages d’erreur et timings uniformes).

Une politique de mot de passe moderne (NIST)

Les vieilles règles de « complexité » ont fait la preuve de leur contre-productivité : forcer « 1 majuscule, 1 chiffre, 1 symbole » pousse les gens vers Password1! (faible et prévisible) ; imposer un changement tous les 90 jours produit Password1!Password2!. Les recommandations modernes (résumées par le NIST) inversent la logique :

À faireÀ ne plus faire
Exiger une longueur minimale raisonnable (privilégier la longueur : les phrases de passe sont fortes et mémorisables).Imposer des règles de composition rigides (types de caractères obligatoires).
Autoriser tout le clavier (espaces, unicode, longueur généreuse — au moins 64).Interdire des caractères, tronquer silencieusement.
Vérifier contre une liste de mots de passe compromis / trop courants et refuser ceux-là.Forcer des changements périodiques sans raison (sauf compromission avérée).
Proposer/encourager un gestionnaire de mots de passe et le collage.Bloquer le coller dans le champ mot de passe.
Ajouter une MFA (chapitre 4.3) — le vrai gain de sécurité.Croire que la « complexité » suffit.

📚 La source — Les recommandations précises (longueurs, modalités) évoluent : la référence est le NIST SP 800-63B (Digital Identity Guidelines) et l’OWASP Authentication Cheat Sheet. On retient ici l’esprit — longueur > complexité, bannir les compromis connus, pas de rotation forcée, MFA — plutôt qu’un seuil chiffré qui bougera. La liste des mots de passe compromis se vérifie via des services de type Pwned Passwords (avec un modèle k-anonymity qui n’envoie pas le mot de passe complet).

Bloquer le bruteforce

Le bruteforce consiste à essayer un grand nombre de mots de passe sur un compte. Sans limite, un attaquant peut tester des milliers de candidats par minute. Les parades, en couches :

  • Rate limiting : limiter le nombre de tentatives par IP et par compte sur une fenêtre de temps (ex. quelques essais par minute), puis ralentir/refuser.
  • Verrouillage temporisé progressif : après N échecs, imposer un délai croissant (back-off exponentiel) plutôt qu’un blocage définitif (qui deviendrait un déni de service : un attaquant verrouille volontairement le compte d’autrui).
  • Captcha / preuve de travail après quelques échecs, pour couper les bots.
  • MFA : même un mot de passe deviné ne suffit plus (chapitre 4.3).
  • Hachage lent (argon2id) : rend chaque tentative coûteuse côté attaquant s’il a volé la base (bruteforce hors-ligne).

⚠️ Piège — Un verrouillage définitif après N échecs est une fausse bonne idée : il transforme la protection en arme — un attaquant qui connaît des emails peut verrouiller tous les comptes à volonté (déni de service). Préfère un ralentissement progressif (délais croissants, captcha), un rate limiting par IP+compte, et surtout la MFA, qui rend le bruteforce du seul mot de passe insuffisant.

Contrer le credential stuffing

Le credential stuffing est différent du bruteforce : l’attaquant ne devine pas, il rejoue des couples email/mot de passe volés ailleurs (fuites d’autres sites). Comme les gens réutilisent leurs mots de passe, un pourcentage non négligeable de ces couples fonctionne. C’est massif, automatisé, et le rate limiting par compte n’y suffit pas (un essai par compte, sur des millions de comptes).

Parades spécifiques :

  • MFA : la défense reine — le mot de passe volé ne donne pas accès sans le second facteur.
  • Vérifier les mots de passe compromis à l’inscription et au changement (refuser ceux connus dans des fuites).
  • Détection comportementale : pics de connexions échouées depuis de nombreuses IP, alertes.
  • Rate limiting par IP / device fingerprint, et surveillance des schémas de trafic.

Ne pas fuiter quels comptes existent (énumération)

Un détail qui compte : le flux de connexion (et de reset, d’inscription) ne doit pas révéler si un email existe dans ta base. Sinon, un attaquant énumère les comptes valides avant de les cibler.

# ❌ Fuite : deux messages differents "Cet email n'existe pas." <- l'attaquant sait que le compte n'existe PAS "Mot de passe incorrect." <- ... et la, qu'il EXISTE # ✅ Message unique, quelle que soit la cause "Identifiants incorrects."

Deux vecteurs de fuite à neutraliser :

  • Le message : toujours le même (« identifiants incorrects »), que l’email existe ou non.
  • Le timing : si « email inexistant » répond en 5 ms et « mot de passe faux » en 300 ms (car on a haché), la différence de temps trahit l’existence. Parade : effectuer un travail comparable dans les deux cas (par ex. hacher un mot de passe factice quand l’utilisateur n’existe pas) pour uniformiser le temps de réponse.

Idem pour l’inscription (« cet email est déjà utilisé » énumère) et le reset (« si un compte existe, un email a été envoyé » plutôt que « aucun compte avec cet email »).

🎯 Côté attaquant — Avant de bruteforcer, l’attaquant cartographie : il envoie des emails au login et au reset et compare messages et temps de réponse pour dresser la liste des comptes réels. Chaque différence observable — un mot près, quelques millisecondes — est une fuite exploitable. La parade est l’uniformité systématique : même réponse, même temps, même comportement, que le compte existe ou non.

💡 Réflexe — Trois réflexes pour tout formulaire d’auth : (1) message générique unique, (2) temps de réponse uniforme (travail équivalent dans tous les cas), (3) rate limiting. Ils se pensent ensemble, dès la conception du endpoint — pas après coup.

🧭 Sur FormaCampus — Le login de FormaCampus applique le lot complet : politique NIST (longueur privilégiée, phrases de passe autorisées, mots de passe compromis refusés à l’inscription, pas de rotation forcée), rate limiting par IP + compte avec back-off progressif (jamais de verrouillage définitif), captcha après plusieurs échecs, et MFA proposée (obligatoire pour les rôles formateur/admin). Les messages sont uniformes (« identifiants incorrects ») et le endpoint hache un mot de passe factice quand l’email est inconnu, pour un timing constant. Le reset répond toujours « si un compte existe, un email a été envoyé ».

✏️ Exercices

Exercice 1 — Répare la politique. Une appli impose : mot de passe de 8 caractères exactement, avec 1 majuscule + 1 chiffre + 1 symbole, changé tous les 90 jours, collage désactivé. Cite trois problèmes et propose une politique moderne.

✅ Solution

Problèmes : (1) longueur figée à 8 et faible — trop court, alors que la longueur est le principal facteur de force ; (2) règles de composition rigides → poussent vers des mots de passe prévisibles (Passw0rd!) ; (3) changement forcé tous les 90 jours → produit des variantes incrémentales (...1, ...2) et fatigue l’utilisateur ; (4) collage désactivé → empêche l’usage d’un gestionnaire de mots de passe (qui améliore la sécurité). Politique moderne : longueur minimale généreuse et maximum élevé (≥64), phrases de passe autorisées, tout le clavier permis, vérification contre les mots de passe compromis, pas de rotation forcée (sauf compromission), collage autorisé, et MFA.

Exercice 2 — Traque la fuite. Ce endpoint de login répond 404 "utilisateur inconnu" si l’email n’existe pas, et 401 "mot de passe incorrect" sinon. En plus, le premier cas répond en ~3 ms, le second en ~250 ms. Quels sont les deux problèmes et comment corriger ?

✅ Solution

(1) Fuite par le message/statut : deux réponses distinctes révèlent si l’email existe → énumération de comptes. Corriger : une seule réponse générique (« identifiants incorrects », même statut) dans les deux cas. (2) Fuite par le timing : 3 ms vs 250 ms trahit l’existence (le cas « existe » prend le temps de hacher). Corriger : effectuer un travail équivalent quand l’utilisateur n’existe pas (hacher un mot de passe factice) pour uniformiser le temps de réponse. Ajouter du rate limiting par-dessus.

🧠 Quiz de révision

1. Quelles mauvaises habitudes la politique NIST recommande-t-elle d’abandonner ?

Les règles de composition rigides (types de caractères obligatoires), le changement périodique forcé (sans compromission), l’interdiction du collage, et la troncature/limitation des caractères. On privilégie la longueur, les phrases de passe, le bannissement des mots de passe compromis et la MFA.

2. Pourquoi un verrouillage définitif après N échecs est-il risqué ?

Parce qu’il devient une arme de déni de service : un attaquant connaissant des emails peut verrouiller volontairement les comptes d’autrui. On préfère un back-off progressif (délais croissants), un captcha, du rate limiting par IP+compte, et la MFA.

3. Quelle différence entre bruteforce et credential stuffing ?

Bruteforce : essayer beaucoup de mots de passe sur un compte (deviner). Credential stuffing : rejouer des couples email/mot de passe volés ailleurs (les gens réutilisent) sur de nombreux comptes. Le stuffing contourne le rate limiting par compte ; la parade reine est la MFA + le refus des mots de passe compromis.

4. Qu’est-ce que l’énumération de comptes et par quels deux canaux fuit-elle ?

Découvrir quels emails existent dans la base. Elle fuit par le message/statut (« email inconnu » vs « mot de passe incorrect ») et par le timing (réponse plus rapide quand l’email n’existe pas). Parades : message générique unique et temps de réponse uniforme (travail équivalent).

5. Quel est le gain de sécurité le plus important à ajouter à un login par mot de passe ?

La MFA (second facteur) : elle rend inopérants le mot de passe deviné (bruteforce) et le mot de passe volé ailleurs (credential stuffing). C’est le levier le plus efficace, bien plus que durcir la « complexité » du mot de passe. (Voir chapitre 4.3.)


Chapitre suivant : MFA, TOTP & passkeys — ajouter un second facteur, des codes TOTP aux passkeys qui suppriment carrément le mot de passe.

Last updated on