Aller au contenu
M08 · C. Protéger les applications Web

La politique de mots de passe

Ce qui rend un mot de passe solide (longueur, entropie, phrases de passe), les attaques par force brute, par dictionnaire et par bourrage d'identifiants, une politique de mots de passe raisonnable, son contrôle en PHP, le stockage avec password_hash, le blocage des tentatives répétées et la double authentification.

1Situer

Le mot de passe reste la serrure la plus utilisée du web. Le développeur décide de presque tout : ce qu'il accepte à l'inscription, comment il le stocke, ce qui se passe après dix essais ratés, comment on le réinitialise. Une bonne politique protège les utilisateurs... sans les pousser à coller leur mot de passe sur un post-it.

2Comprendre

Deviner un mot de passe par force brute
Robot 1. 123456 ✖ 2. azerty ✖ 3. maroc2025 ✖ 4. password ✖ 5. amina1999 ✖ Bloqué15 minutes 8 caractères simplesquelques heures 4 mots aléatoiresdes siècles

Un robot essaie des mots de passe à la chaîne sur la page de connexion, en commençant par les plus courants.

1 / 4

Comment on casse un mot de passe

Elles se font en ligne (contre le formulaire de connexion : on les freine en bloquant les tentatives) ou hors ligne (sur une base de hachages volée : seul un hachage lent comme bcrypt les freine).

Ce qui fait un bon mot de passe

Une politique raisonnable

Les recommandations actuelles (NIST, ANSSI, DGSSI) vont dans le même sens :

RèglePourquoi
Longueur minimale (12 ou plus, 8 si double authentification)c’est le facteur le plus important
Refuser les mots de passe courants ou déjà fuitésce sont les premiers essayés
Accepter tous les caractères, espaces compris, et les phrases longuesencourager les phrases de passe
Limiter les tentatives (blocage temporaire, délai croissant, CAPTCHA)rendre la force brute en ligne inutile
Double authentification pour les comptes importantsun mot de passe volé ne suffit plus
Pas de changement forcé à date fixe, mais changement en cas de fuiteles changements forcés donnent Souk2025! puis Souk2026!
Pas d’indice de mot de passe, pas de « question secrète »les réponses se devinent ou se trouvent sur les réseaux sociaux

Côté serveur

  • Stockage : password_hash($mdp, PASSWORD_DEFAULT) et password_verify (module 07, leçon C.5). Jamais de mot de passe en clair, ni dans la base, ni dans les journaux, ni dans les e-mails.
  • Limitation : compter les échecs par compte et par adresse IP, bloquer temporairement, et prévenir l’utilisateur.
  • Messages : « Identifiants incorrects », sans préciser si c’est l’e-mail ou le mot de passe qui est faux : sinon l’attaquant apprend quels comptes existent.
  • Double authentification (MFA) : un code à usage unique (application d’authentification, clé de sécurité), en plus du mot de passe.
Exemple simple

Le cadenas à 3 ou à 10 molettes

Un cadenas à 3 molettes a 1 000 combinaisons : on l'ouvre en une soirée en essayant tout. À 10 molettes, il y en a 10 milliards. Chaque caractère ajouté à un mot de passe multiplie le travail de l'attaquant.

Exemple simple

Une seule clé pour toute la ville

Utiliser la même clé pour la maison, la voiture et le bureau : si on la perd une fois, tout est ouvert. Réutiliser un mot de passe sur plusieurs sites, c'est pareil, et les pirates essaient systématiquement les mots de passe volés ailleurs.

3Manipuler

Appliquez la politique de Souk Atlas à l'inscription (12 caractères minimum, une minuscule, une majuscule, un chiffre, pas un mot de passe courant), stockez le mot de passe avec password_hash, puis bloquez la connexion après 5 échecs.
Pas à pas dans le lab ↗ Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).

La page s'affichera ici.

Le navigateur demandera /inscription.php au serveur, qui exécutera le PHP et renverra du HTML.

Entre le navigateur et le serveur aucun échange pour l'instant

Consignes 0 / 6

  1. « azerty » est refusé : au moins 12 caractères
  2. « motdepasse2025 » est refusé : il manque une majuscule
  3. « Azerty123456 » est refusé : trop courant
  4. « Tajine#Fes2025 » est accepté et stocké haché
  5. Après 5 échecs, même le bon mot de passe est bloqué
  6. Un échec isolé n'empêche pas de se connecter ensuite

4Pratiquer

Exercice 1 · Calculer l'entropie

Combien de combinaisons pour (a) un code de 4 chiffres, (b) 8 caractères parmi 26 minuscules, (c) 12 caractères parmi 94 caractères imprimables ? À un milliard d'essais par seconde, combien de temps pour tout essayer ?

Voir le corrigé
(a) 10^4 = 10 000 : instantané.
(b) 26^8 ≈ 2,1 × 10^11 : environ 3,5 minutes.
(c) 94^12 ≈ 4,8 × 10^23 : environ 15 millions d'années.
La longueur compte plus que tout : chaque caractère ajouté multiplie le nombre de combinaisons. Contre un hachage lent (bcrypt), le nombre d'essais par seconde s'effondre encore.

Exercice 2 · Réinitialiser un mot de passe

Décrivez un processus sûr de « mot de passe oublié » pour Souk Atlas.

Voir le corrigé
1. L'utilisateur donne son e-mail ; la page répond toujours la même chose (« si ce compte existe, un e-mail a été envoyé ») pour ne pas révéler quels comptes existent.
2. Le serveur crée un jeton aléatoire (bin2hex(random_bytes(32))), en stocke le hachage avec une expiration courte (30 minutes) et l'envoie dans un lien.
3. Le lien n'est utilisable qu'une fois ; le nouveau mot de passe suit la politique et est haché avec password_hash.
4. Toutes les sessions ouvertes sont fermées et l'utilisateur reçoit un e-mail de confirmation.
On n'envoie jamais l'ancien mot de passe (le site ne le connaît pas) ni un nouveau mot de passe en clair.

5Vérifier

1. Quelle règle augmente le plus la résistance d'un mot de passe ?
2. Qu'est-ce que le bourrage d'identifiants (credential stuffing) ?
3. Comment stocker un mot de passe en PHP ?