Chapitre 422 minIntermédiaire
Politique de mots de passe : recommandations CNIL et ANSSI
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- calculer l'entropie d'un mot de passe et la durée d'une force brute ;
- appliquer les recommandations de la CNIL et de l'ANSSI ;
- stocker un mot de passe avec un hachage lent et salé ;
- concevoir une réinitialisation de mot de passe sûre ;
- configurer la stratégie de mots de passe d'Active Directory.
5 exercices corrigés
Une politique de mots de passe est l'ensemble des règles qu'une organisation fixe pour ses mots de passe : longueur et composition, renouvellement, blocage après des échecs, procédure de réinitialisation et façon de les stocker. Une bonne politique s'appuie sur les recommandations de la CNIL (2022) et de l'ANSSI (2021) : des mots de passe longs plutôt que compliqués, pas de renouvellement forcé sans raison, une limite au nombre d'essais et un stockage par hachage salé. Ce chapitre explique chacune de ces règles en partant des attaques qu'elle bloque.
Comment les mots de passe sont attaqués
| Attaque | Principe | Ce qui la bloque |
|---|---|---|
| Force brute | Essayer toutes les combinaisons possibles | La longueur, et la limite d'essais en ligne |
| Dictionnaire | Essayer les mots de passe les plus courants (123456, azerty, Soleil2026!) et leurs variantes | Refuser les mots de passe connus (liste noire) |
| Bourrage d'identifiants (credential stuffing) | Réessayer sur un site les couples identifiant et mot de passe volés sur un autre | Un mot de passe différent par site, la MFA |
| Pulvérisation (password spraying) | Essayer un ou deux mots de passe très courants sur tous les comptes, pour rester sous le seuil de blocage | Liste noire, détection des échecs répartis sur plusieurs comptes, MFA |
| Attaque hors ligne | Après le vol de la base, calculer des empreintes à la chaîne sur des cartes graphiques, sans aucune limite d'essais | Un hachage lent et salé (Argon2id, bcrypt) |
| Hameçonnage, enregistreur de frappe | Faire saisir le mot de passe sur un faux site ou l'enregistrer à la frappe | La MFA, mieux encore une passkey (chapitre 3) |
Deux situations sont très différentes. En ligne, l'attaquant doit passer par le formulaire de connexion : le serveur peut le ralentir et le bloquer. Hors ligne, il a volé la base et calcule chez lui : seule la qualité du mot de passe et du hachage le freine.
Mesurer la force d'un mot de passe : l'entropie
L'entropie mesure le nombre de combinaisons qu'un attaquant doit essayer, exprimé en bits. Pour un mot de passe tiré au hasard de n caractères parmi un alphabet de N symboles :
H = n × log₂(N) bits, et le nombre de combinaisons vaut N^n = 2^H.
Chaque bit supplémentaire double le travail de l'attaquant.
| Composition (tirée au hasard) | Alphabet N | log₂ N | Longueur | Entropie |
|---|---|---|---|---|
| Code PIN | 10 chiffres | 3,32 | 4 | 13,3 bits |
| Minuscules | 26 | 4,70 | 8 | 37,6 bits |
| Minuscules, majuscules, chiffres | 62 | 5,95 | 8 | 47,6 bits |
| Minuscules, majuscules, chiffres | 62 | 5,95 | 12 | 71,5 bits |
| Minuscules, majuscules, chiffres | 62 | 5,95 | 14 | 83,4 bits |
| Les mêmes plus 37 caractères spéciaux | 99 | 6,63 | 12 | 79,6 bits |
| Phrase de passe : mots tirés d'une liste de 7 776 mots | 7 776 | 12,9 | 7 mots | 90,5 bits |
Concrètement : 8 caractères parmi 62 donnent 62⁸ ≈ 2,18 × 10¹⁴ combinaisons. Une machine qui calcule 10 milliards d'empreintes rapides par seconde (l'ordre de grandeur d'un hachage SHA-256 sur quelques cartes graphiques) les essaie toutes en 21 834 secondes, à peine plus de 6 heures. Avec 12 caractères, il lui faudrait plus de 10 000 ans.
Les recommandations de la CNIL (2022)
La CNIL a publié sa recommandation relative aux mots de passe par la délibération n° 2022-100 du 21 juillet 2022. Elle raisonne en entropie minimale, selon les protections qui entourent le mot de passe :
| Cas | Entropie minimale | Exemples d'usage | Mesures qui accompagnent |
|---|---|---|---|
| Mot de passe seul | 80 bits | Forum, blog | Conseiller l'utilisateur sur le choix du mot de passe |
| Avec restriction d'accès | 50 bits | Site de commerce, compte d'entreprise, messagerie en ligne | Temporisation après plusieurs échecs, nombre maximal d'essais sur une période, CAPTCHA, ou blocage après 10 échecs avec un mécanisme de déblocage |
| Avec matériel détenu par la personne | 13 bits | Carte bancaire, téléphone | Matériel détenu en propre (carte SIM, carte bancaire, certificat) et blocage après 3 échecs |
Pour atteindre 80 bits, la CNIL donne trois exemples équivalents : 12 caractères mêlant majuscules, minuscules, chiffres et caractères spéciaux (pris dans une liste d'au moins 37) ; 14 caractères de majuscules, minuscules et chiffres sans caractère spécial imposé ; ou une phrase de passe d'au moins 7 mots. Pour 50 bits, 9 caractères tirés au hasard parmi les 62 lettres et chiffres suffisent (53,6 bits).
Deux autres points de la recommandation tombent souvent dans les sujets :
- le renouvellement périodique n'est plus demandé pour les comptes ordinaires, seulement pour les comptes d'administration. Forcer un changement tous les trois mois pousse les utilisateurs à des variantes prévisibles (
Printemps2026!, puisEte2026!) ; - le stockage : jamais en clair ; le mot de passe est transformé par une fonction cryptographique non réversible et sûre, avec un sel ou une clé. La CNIL cite scrypt et Argon2.
Les recommandations de l'ANSSI et du NIST
Le guide de l'ANSSI Recommandations relatives à l'authentification multifacteur et aux mots de passe (version 2.0, 8 octobre 2021) va dans le même sens : privilégier la MFA, imposer une longueur minimale sans imposer de longueur maximale (une longueur maximale interdit les phrases de passe), ne pas imposer d'expiration par défaut pour les comptes ordinaires, conserver les mots de passe sous forme d'empreinte salée calculée par une fonction lente, et proposer un gestionnaire de mots de passe.
Aux États-Unis, la révision 4 du guide NIST SP 800-63B (2025) est encore plus directe : au moins 15 caractères quand le mot de passe est le seul facteur (8 s'il fait partie d'une MFA), au moins 64 caractères acceptés, interdiction des règles de composition (« au moins une majuscule et un chiffre ») et des changements périodiques forcés, vérification obligatoire contre une liste de mots de passe compromis, limitation des essais.
Limiter les essais sans se bloquer soi-même
Face à la force brute en ligne, deux mécanismes existent :
- la temporisation : après chaque échec, le délai avant l'essai suivant augmente (1 seconde, 2, 4, 8…) ;
- le verrouillage : après un nombre d'échecs donné, le compte est bloqué pour une durée fixée, ou jusqu'à ce qu'un administrateur le débloque.
Le verrouillage a un revers : un attaquant qui connaît la liste des identifiants peut bloquer tous les comptes de l'entreprise en tapant n'importe quoi. C'est une attaque sur la disponibilité. Une politique équilibrée combine un seuil assez haut (la CNIL cite 10 échecs), un déblocage automatique au bout de quelques minutes, une alerte pour l'équipe de sécurité et une limitation par adresse IP.
Stocker un mot de passe : hacher, saler, ralentir
Le serveur n'a pas besoin de connaître le mot de passe : il lui suffit de vérifier que l'utilisateur tape le bon. Il garde donc une empreinte (hash), calculée par une fonction de hachage : facile à calculer, impossible à inverser.
- Hacher plutôt que chiffrer. Un mot de passe chiffré peut être déchiffré par quiconque obtient la clé, administrateur compris. Une empreinte ne se « déchiffre » pas : la seule attaque est d'essayer des mots de passe et de comparer les empreintes.
- Saler. Le sel est une valeur aléatoire, différente pour chaque utilisateur, ajoutée au mot de passe avant le hachage et stockée avec l'empreinte. Deux utilisateurs qui ont le même mot de passe ont deux empreintes différentes, et les tables d'empreintes précalculées (rainbow tables) deviennent inutiles.
- Ralentir. MD5, SHA-1 et même SHA-256 sont conçus pour être rapides : parfaits pour vérifier l'intégrité d'un fichier, désastreux pour des mots de passe. Les fonctions faites pour les mots de passe sont volontairement lentes et réglables : Argon2id (le choix recommandé aujourd'hui), bcrypt, scrypt. Si chaque essai coûte un dixième de seconde au lieu d'un dix-milliardième, l'attaque hors ligne devient impraticable sur un mot de passe correct.
| Algorithme | Pour les mots de passe ? | Pourquoi |
|---|---|---|
| Stockage en clair | Jamais | Une fuite expose tout immédiatement, y compris les mots de passe réutilisés ailleurs |
| Chiffrement (AES) | Non | Réversible : la clé donne tous les mots de passe |
| MD5, SHA-1 | Non | Rapides et cassés |
| SHA-256 sans sel | Non | Rapide, et sans sel les mots de passe identiques ont la même empreinte |
| bcrypt (coût 12 ou plus) | Oui | Lent, salé automatiquement ; tronque au-delà de 72 octets |
| Argon2id | Oui, recommandé | Lent et gourmand en mémoire, ce qui freine les cartes graphiques. L'OWASP propose au minimum 19 Mio de mémoire, 2 itérations, 1 fil |
En PHP, n'écris rien toi-même : password_hash() génère le sel et produit une chaîne qui contient l'algorithme, le coût, le sel et l'empreinte. Depuis PHP 8.4, le coût par défaut de bcrypt est passé de 10 à 12.
<?php
// Inscription ou changement de mot de passe
$empreinte = password_hash($motDePasse, PASSWORD_DEFAULT);
// $2y$12$... : 60 caractères (prévoir VARCHAR(255) pour les algorithmes futurs)
// Connexion
if (password_verify($motDePasseSaisi, $empreinteEnBase)) {
if (password_needs_rehash($empreinteEnBase, PASSWORD_DEFAULT)) {
// Les paramètres ont changé depuis : on recalcule avec les nouveaux
$nouvelle = password_hash($motDePasseSaisi, PASSWORD_DEFAULT);
// ... UPDATE utilisateur SET empreinte = :nouvelle WHERE id = :id
}
// ... ouvrir la session (chapitre 5)
} else {
// Même message que pour un identifiant inconnu
$erreur = 'Identifiant ou mot de passe incorrect.';
}
En Node.js, avec la bibliothèque bcrypt :
import bcrypt from 'bcrypt';
const empreinte = await bcrypt.hash(motDePasse, 12); // 12 = facteur de coût
const valide = await bcrypt.compare(motDePasseSaisi, empreinte);
L'historique des anciens mots de passe
Une politique peut interdire de reprendre l'un des derniers mots de passe : c'était le cas du sujet d'E7 SLAM de 2025, où un utilisateur ne pouvait pas reprendre l'un des cinq derniers, avec une table HistoMotDePasse alimentée par un trigger. Le piège technique : comme chaque empreinte a son propre sel, comparer l'empreinte du nouveau mot de passe aux anciennes empreintes ne trouve jamais d'égalité. Il faut vérifier le nouveau mot de passe contre chaque ancienne empreinte, avec la fonction de vérification :
<?php
// Vrai si le nouveau mot de passe correspond à l'une des empreintes de l'historique
function dejaUtilise(string $nouveau, array $anciennesEmpreintes): bool {
foreach ($anciennesEmpreintes as $empreinte) {
if (password_verify($nouveau, $empreinte)) {
return true;
}
}
return false;
}
La réinitialisation d'un mot de passe oublié
Le lien « Mot de passe oublié ? » est une porte d'entrée aussi importante que le formulaire de connexion. Le sujet d'E7 SLAM de 2025 décrivait une procédure à corriger : l'utilisateur saisit son adresse mail et reçoit par courriel son identifiant et un nouveau mot de passe. Les défauts d'une telle procédure : le mot de passe circule en clair dans un courriel (qui reste dans la boîte, peut être intercepté ou lu par quiconque accède à la messagerie), et l'identifiant et le mot de passe arrivent ensemble, si bien qu'un seul message suffit pour prendre le compte.
La procédure sûre :
- l'utilisateur saisit son adresse ; le site affiche le même message que l'adresse existe ou non (« Si un compte correspond, un courriel a été envoyé ») ;
- le serveur génère un jeton aléatoire (au moins 128 bits), en stocke l'empreinte avec une date d'expiration courte (de 15 minutes à 1 heure) et envoie un lien qui le contient ;
- le lien mène à une page où l'utilisateur choisit lui-même un nouveau mot de passe ; le jeton est alors invalidé, il ne sert qu'une fois ;
- les sessions ouvertes sont fermées, et un courriel de notification prévient l'utilisateur que son mot de passe a changé ;
- le nombre de demandes est limité, pour éviter d'inonder une boîte de courriels.
Côté SISR : la stratégie de mots de passe d'Active Directory
Dans un domaine Active Directory, la politique de mots de passe se règle dans la stratégie de groupe Default Domain Policy, sous Configuration ordinateur > Stratégies > Paramètres Windows > Paramètres de sécurité > Stratégies de comptes : longueur minimale (7 caractères par défaut, bien trop peu), complexité, historique, durée de vie maximale, seuil et durée de verrouillage. Cette stratégie s'applique à tout le domaine.
Pour imposer une règle plus stricte aux administrateurs, on utilise une stratégie de mot de passe affinée (Fine-Grained Password Policy, ou objet PSO), appliquée à un groupe :
# Une politique plus stricte pour les comptes d'administration
New-ADFineGrainedPasswordPolicy -Name "PSO-Admins" -Precedence 10 `
-MinPasswordLength 16 -ComplexityEnabled $true -PasswordHistoryCount 24 `
-MaxPasswordAge "180.00:00:00" -MinPasswordAge "1.00:00:00" `
-LockoutThreshold 5 -LockoutDuration "00:30:00" -LockoutObservationWindow "00:30:00"
Add-ADFineGrainedPasswordPolicySubject -Identity "PSO-Admins" -Subjects "GG_Admins_Domaine"
# Quelle politique s'applique vraiment à ce compte ?
Get-ADUserResultantPasswordPolicy -Identity "a.mercier.adm"
Sous Linux, le module PAM pam_pwquality fixe la longueur et la qualité (fichier /etc/security/pwquality.conf, paramètre minlen), et pam_faillock le verrouillage après des échecs (/etc/security/faillock.conf, paramètres deny et unlock_time). Pour les mots de passe des comptes administrateur locaux des postes, Windows LAPS génère un mot de passe différent par machine, le renouvelle et le stocke dans l'annuaire (chapitre 10).
Côté SLAM : vérifier un mot de passe à l'inscription
Le contrôle côté serveur fait trois choses : vérifier la longueur minimale, refuser les mots de passe connus ou compromis, et ne jamais tronquer silencieusement. Pour savoir si un mot de passe figure dans une fuite publique sans l'envoyer à un tiers, le service Pwned Passwords de Have I Been Pwned utilise l'anonymat par plage (k-anonymity) : l'application calcule l'empreinte SHA-1 du mot de passe, n'envoie que ses 5 premiers caractères hexadécimaux, reçoit la liste des empreintes qui commencent ainsi et cherche elle-même la suite. Le service ne voit jamais le mot de passe ni son empreinte complète.
Le contrôle côté client (en JavaScript dans la page) améliore le confort, avec une jauge de solidité, mais ne protège rien : il se contourne en envoyant la requête directement au serveur.
Comment l'E7 l'interroge
C'est la notion la plus fréquente de tout le thème. Les questions récurrentes :
- Tronc commun : expliquer une attaque par force brute ou par dictionnaire ; comparer deux politiques en termes d'entropie ; dire pourquoi un PIN court est acceptable sur une carte et pas sur un site ; relever les manquements d'une politique au regard des recommandations de la CNIL.
- SLAM : expliquer pourquoi les mots de passe en clair doivent disparaître de la base et choisir entre empreinte et chiffrement (sujet 2025, question B1.1) ; écrire ou corriger la méthode qui contrôle la complexité ; corriger un trigger d'historique ; proposer une procédure de réinitialisation sûre.
- SISR : configurer la stratégie de mots de passe du domaine et une stratégie affinée pour les administrateurs ; analyser un journal qui montre des centaines d'échecs de connexion ; proposer une solution pour les mots de passe des administrateurs locaux.
Pour aller plus loin. Le chapitre Stocker un mot de passe du cours Cryptographie montre pourquoi le sel et une fonction lente arrêtent les attaques par dictionnaire, et le chapitre Authentification (A07) du cours Sécurité applicative la place parmi les failles de l'OWASP Top 10.
Exercices
Exercice 1 sur 5 Calculer l'entropie Réussi À revoir
On donne log₂ 10 ≈ 3,32 ; log₂ 26 ≈ 4,70 ; log₂ 62 ≈ 5,95 ; log₂ 7 776 ≈ 12,92. Les mots de passe sont tirés au hasard.
- Calcule l'entropie d'un mot de passe de 10 caractères parmi les 62 lettres et chiffres.
- Calcule celle d'une phrase de passe de 6 mots tirés d'une liste de 7 776 mots.
- Combien de minuscules faut-il au minimum pour atteindre 80 bits ?
- Classe ces trois mots de passe par rapport aux 80 bits du premier cas de la CNIL.
Voir la réponseMasquer la réponse de l'exercice 1
- 10 × 5,95 = 59,5 bits.
- 6 × 12,92 = 77,5 bits.
- 80 ÷ 4,70 ≈ 17,02 : il en faut 18 (17 minuscules donnent 17 × 4,70 = 79,9 bits, juste en dessous).
- Aucun des deux premiers n'atteint 80 bits : 59,5 et 77,5 bits. Ils conviennent en revanche au deuxième cas (50 bits), avec une limitation des essais. Une phrase de 7 mots (7 × 12,92 ≈ 90,4 bits, 90,5 avec la valeur exacte) atteindrait le premier cas, ce qui rejoint l'exemple de la CNIL.
Tu avais trouvé ?
Exercice 2 sur 5 Le progiciel aux mots de passe de six caractères Réussi À revoir
Un progiciel impose seulement une longueur de 6 caractères et stocke les mots de passe en clair dans la table Utilisateur.
- Même en supposant des mots de passe choisis au hasard parmi les 62 lettres et chiffres, combien de combinaisons existe-t-il ? Combien de temps faut-il pour toutes les essayer à 10 milliards par seconde ?
- Pourquoi faut-il supprimer les mots de passe en clair de la base ?
- Faut-il enregistrer le mot de passe chiffré ou son empreinte ? Justifie.
Voir la réponseMasquer la réponse de l'exercice 2
- 62⁶ = 56 800 235 584 combinaisons, soit environ 5,7 secondes à 10 milliards par seconde. Et ce calcul est optimiste : de vrais utilisateurs choisissent des mots de passe bien plus prévisibles.
- Toute personne qui lit la table (un administrateur, un développeur, un attaquant après une intrusion ou une injection SQL, quelqu'un qui récupère une sauvegarde) obtient immédiatement tous les mots de passe. Comme beaucoup d'utilisateurs réutilisent leur mot de passe, la fuite compromet aussi leurs autres comptes. C'est contraire à l'obligation de sécurité du RGPD (article 32) et à la recommandation de la CNIL.
- L'empreinte, calculée avec une fonction lente et salée (Argon2id, bcrypt). Le chiffrement est réversible : la clé de déchiffrement, qui doit être stockée quelque part pour que l'application fonctionne, donne accès à tous les mots de passe. L'application n'a jamais besoin de retrouver le mot de passe, seulement de vérifier qu'il est juste : une fonction à sens unique suffit.
Tu avais trouvé ?
Exercice 3 sur 5 Auditer une politique Réussi À revoir
La PSSI d'une PME prévoit : 8 caractères minimum avec au moins une majuscule, un chiffre et un caractère spécial ; changement obligatoire tous les 60 jours pour tous ; verrouillage définitif après 3 échecs, déblocage par le support ; mots de passe stockés avec SHA-256 sans sel. Relève quatre points à améliorer et propose une correction pour chacun.
Voir la réponseMasquer la réponse de l'exercice 3
- Longueur insuffisante : 8 caractères donnent au mieux une cinquantaine de bits. Passer à 12 caractères au moins avec les quatre types, ou à 14 sans caractère spécial imposé, ou accepter les phrases de passe, et refuser les mots de passe connus.
- Renouvellement tous les 60 jours pour tous : il pousse aux variantes prévisibles. Le supprimer pour les comptes ordinaires (en le gardant pour les comptes d'administration) et forcer le changement en cas de compromission.
- Verrouillage définitif après 3 échecs : n'importe qui peut bloquer tous les comptes et le support est saturé. Préférer une temporisation progressive, ou un verrouillage temporaire de quelques minutes après une dizaine d'échecs, avec alerte.
- SHA-256 sans sel : trop rapide, et les mots de passe identiques ont la même empreinte. Utiliser Argon2id ou bcrypt (coût 12 ou plus), qui salent automatiquement, et recalculer l'empreinte à la prochaine connexion de chaque utilisateur.
Tu avais trouvé ?
Exercice 4 sur 5 L'historique qui ne marche pas Réussi À revoir
Un développeur vérifie qu'un nouveau mot de passe n'est pas dans l'historique ainsi :
$nouvelle = password_hash($nouveau, PASSWORD_DEFAULT);
$req = $pdo->prepare('SELECT COUNT(*) FROM HistoMotDePasse WHERE idUtilisateur = ? AND empreinte = ?');
$req->execute([$id, $nouvelle]);
$dejaUtilise = $req->fetchColumn() > 0;
Les tests montrent que $dejaUtilise vaut toujours false, même quand l'utilisateur reprend son ancien mot de passe. Explique pourquoi et corrige.
Voir la réponseMasquer la réponse de l'exercice 4
password_hash() génère un sel aléatoire à chaque appel : l'empreinte du même mot de passe est différente à chaque fois, donc l'égalité en SQL n'est jamais vraie. Il faut lire les empreintes de l'historique et vérifier le nouveau mot de passe contre chacune :
$req = $pdo->prepare('SELECT empreinte FROM HistoMotDePasse WHERE idUtilisateur = ?');
$req->execute([$id]);
$dejaUtilise = false;
foreach ($req->fetchAll(PDO::FETCH_COLUMN) as $empreinte) {
if (password_verify($nouveau, $empreinte)) {
$dejaUtilise = true;
break;
}
}
Tu avais trouvé ?
Exercice 5 sur 5 Les administrateurs du domaine Réussi À revoir
Antoine Mercier veut que les comptes d'administration du domaine ad.sorbier.example aient au moins 16 caractères et un verrouillage après 5 échecs, sans changer la règle des autres salariés. Que doit-il configurer, et pourquoi pas la Default Domain Policy ?
Voir la réponseMasquer la réponse de l'exercice 5
Une stratégie de mot de passe affinée (objet PSO), créée avec New-ADFineGrainedPasswordPolicy (ou dans le Centre d'administration Active Directory), puis appliquée au groupe des administrateurs avec Add-ADFineGrainedPasswordPolicySubject. La Default Domain Policy s'applique à tous les comptes du domaine : la durcir pour les administrateurs l'imposerait à tout le monde. Get-ADUserResultantPasswordPolicy permet de vérifier quelle politique s'applique effectivement à un compte.
Tu avais trouvé ?