Aller au contenu principal

Suis-je déjà dans une fuite ? Vérifier un mot de passe sans le révéler

Votre mot de passe a-t-il déjà fuité ? Pour le savoir, faut-il le confier à un site web ? La réponse est non, et c'est ce que ce TP démontre.

Petite vérification​

Avant de commencer, vérifiez si vous savez encore réaliser ces 3 actions très simples, sur la séance précédente consacrée aux métadonnées des photos :

  1. dans le dossier ~/tp-photos (à recréer avec l'étape 1 de la séance précédente s'il n'existe plus), afficher avec exiftool le modèle de l'appareil qui a pris annonce_velo.jpg
  2. donner la commande qui supprime toutes les métadonnées de annonce_velo.jpg
  3. expliquer pourquoi il ne faut pas publier le contenu du dossier juste après cette commande
📌 Réponse attendue

TP pour réfléchir et résoudre des problèmes​

Votre défi pour aujourd'hui consiste à vérifier si des mots de passe ont déjà fuité, sans jamais envoyer ces mots de passe sur Internet

info

La boulangerie « Le Fournil de Lucie » et ses comptes sont fictifs, construits pour l'exercice. Les mots de passe testés sont ceux fournis dans l'énoncé.

attention

N'utilisez pas, dans ce TP, un mot de passe que vous employez réellement. La méthode étudiée ne l'envoie pas en entier sur le réseau, mais un mot de passe saisi dans une commande reste lisible dans l'historique du terminal (étape 6).

Lucie, la gérante du « Fournil de Lucie », vous confie la liste des mots de passe de ses comptes. Elle a peur qu'ils aient déjà fuité lors d'un piratage ailleurs. Vous les vérifierez sans les transmettre à personne, avec le service Pwned Passwords, un service public qui recense les mots de passe apparus dans des fuites :

CompteMot de passe
Caisse enregistreuseazerty
MessagerieSoleil2024!
Tablette de commandebonjour123
ComptabilitéCheval-Agrafeuse-Bleu-Nuage-47

Étape 1 — Vérifier que le service est joignable​

Dans le terminal de votre VM Linux, interrogez le service avec une valeur d'exemple :

curl -s -o /dev/null -w "%{http_code}\n" https://api.pwnedpasswords.com/range/5BAA6
  1. Que doit afficher cette commande si tout fonctionne ?
  2. Que faire si vous obtenez autre chose (un code d'erreur, ou rien du tout) ?
📌 Réponse attendue

Étape 2 — Calculer l'empreinte SHA-1 d'un mot de passe​

Le service ne manipule jamais les mots de passe en clair, mais leur empreinte SHA-1. Calculez celle de azerty, puis celle du même texte envoyé avec echo :

printf '%s' 'azerty' | sha1sum
echo 'azerty' | sha1sum
  1. Combien de caractères comporte l'empreinte ?
  2. Pourquoi les deux commandes donnent-elles deux résultats différents ?
📌 Réponse attendue

Étape 3 — Découper l'empreinte​

Le service attend uniquement les 5 premiers caractères de l'empreinte, en majuscules. Découpez-la :

HASH=$(printf '%s' 'azerty' | sha1sum | cut -d' ' -f1 | tr 'a-f' 'A-F')
PREFIX=${HASH:0:5}
SUFFIX=${HASH:5}
echo $PREFIX
echo $SUFFIX
  1. Quel est le préfixe (les 5 premiers caractères) ?
  2. Combien de caractères comporte le suffixe ?
📌 Réponse attendue

Étape 4 — Interroger le service avec le préfixe seulement​

curl -s https://api.pwnedpasswords.com/range/$PREFIX | head -3
curl -s https://api.pwnedpasswords.com/range/$PREFIX | wc -l
curl -s https://api.pwnedpasswords.com/range/$PREFIX | grep $SUFFIX
  1. À quoi ressemble une ligne de la réponse, et combien y en a-t-il environ ?
  2. Que renvoie la dernière commande pour azerty ?
  3. Qu'a reçu le service, exactement ? A-t-il pu savoir que c'est azerty que vous testez ?
📌 Réponse attendue

Étape 5 — Tester les autres comptes avec une fonction​

Pour ne pas retaper toutes ces commandes, regroupez-les dans une fonction du terminal :

verifier() {
local hash prefix suffix ligne
hash=$(printf '%s' "$1" | sha1sum | cut -d' ' -f1 | tr 'a-f' 'A-F')
prefix=${hash:0:5}
suffix=${hash:5}
ligne=$(curl -s "https://api.pwnedpasswords.com/range/$prefix" | tr -d '\r' | grep "^$suffix")
if [ -n "$ligne" ]; then
echo "$1 : trouvé ${ligne#*:} fois dans des fuites"
else
echo "$1 : absent de la base"
fi
}

Puis testez les 4 mots de passe de Lucie :

verifier 'azerty'
verifier 'Soleil2024!'
verifier 'bonjour123'
verifier 'Cheval-Agrafeuse-Bleu-Nuage-47'
  1. Quels mots de passe sont trouvés dans la base ?
  2. Soleil2024! contient une majuscule, des chiffres et un symbole. Est-il pour autant sûr ?
  3. Quel est le seul mot de passe absent de la base, et pourquoi ?
📌 Réponse attendue

Étape 6 — Ne pas laisser le mot de passe dans l'historique​

Affichez les dernières commandes que vous avez saisies :

history | tail -8

Puis testez un mot de passe sans l'écrire dans la commande :

read -s -p "Mot de passe à tester : " MDP; echo
verifier "$MDP"
unset MDP

Saisissez bonjour123 quand le terminal vous le demande.

  1. Que montre l'historique à propos des mots de passe testés avec verifier ?
  2. Quel est l'effet de l'option -s de read ?
  3. Pourquoi la commande finale unset MDP est-elle utile ?
📌 Réponse attendue

Étape 7 — Conseiller Lucie​

Lucie demande : « Trois mots de passe sur quatre ont fuité. Je les change et c'est réglé ? Et pour mon adresse e-mail, comment savoir si elle a aussi fuité ? » Que lui répondez-vous ?


Restitution orale​

Un étudiant (ou un binôme) vient présenter à la classe la méthode de vérification (étapes 2 à 5) et les conseils donnés à Lucie (étape 7).

  • Durée : 5 minutes de présentation + 2 à 3 minutes de questions.
  • Qui passe : un(e) étudiant(e) (ou un binôme) désigné(e) par l'enseignant.
  • Support : le travail réalisé pendant le TP, aucune préparation supplémentaire n'est nécessaire.
  • Ce qui est attendu :
    • rappeler le contexte (les comptes du Fournil de Lucie) et les résultats obtenus ;
    • présenter la démarche suivie (empreinte, préfixe, comparaison locale) et ses garanties ;
    • répondre aux questions de la classe.
astuce

Cet exercice entraîne à l'oral technique court exigé par plusieurs épreuves du BTS (notamment E5 et E6) : clarté, structure, capacité à répondre à l'improviste.

📌 Une solution

Notions théoriques​

Vous avez vérifié des mots de passe sans jamais les envoyer. Reste à comprendre pourquoi cette vérification est utile, et comment elle protège le secret.

Pourquoi savoir si un mot de passe a déjà fuité​

Lors de la séance sur les fuites de données, vous avez vu que des bases entières de comptes circulent. Les mots de passe qui y figurent sont ensuite rassemblés dans des listes, que les attaquants utilisent en premier : c'est l'attaque par dictionnaire de la première séance, avec un dictionnaire constitué de mots de passe réellement utilisés.

Un mot de passe présent dans une fuite est donc « grillé », même s'il est long ou compliqué. Les recommandations actuelles (par exemple la norme américaine NIST SP 800-63B) conseillent de refuser, à la création d'un compte, les mots de passe connus pour avoir fuité.

info

Le service Have I Been Pwned (littéralement « Ai-je été compromis ? ») a été créé par le chercheur en sécurité Troy Hunt. Sa partie Pwned Passwords recense plusieurs centaines de millions de mots de passe, et son API se consulte sans compte.

La k-anonymité : vérifier sans révéler​

Envoyer son mot de passe à un service pour savoir s'il a fuité serait absurde : on le lui donnerait. Le service utilise donc un principe appelé k-anonymité :

ÉtapeQuiCe qui se passe
1Votre machineCalcule l'empreinte SHA-1 du mot de passe (40 caractères)
2Votre machineDécoupe l'empreinte : préfixe (5 premiers caractères) et suffixe (35 suivants)
3Votre machine → serviceEnvoie uniquement le préfixe
4Service → votre machineRenvoie tous les suffixes connus qui commencent par ce préfixe, avec leur nombre d'apparitions
5Votre machineCherche localement son suffixe dans la liste reçue

Le service reçoit un préfixe partagé par environ 2 000 empreintes : parmi elles, il ne sait pas laquelle est la vôtre. Il se trouve « caché dans un groupe », ce qui est le sens de la k-anonymité. La comparaison finale se fait sur votre machine, jamais chez lui.

SHA-1 n'est pas un problème ici

La séance précédente déconseille SHA-1 pour vérifier un fichier, parce qu'on sait fabriquer des collisions. Ici, l'empreinte sert de clé de recherche, pas de garantie d'intégrité : un attaquant n'a rien à gagner à fabriquer une collision. Le choix de SHA-1 vient simplement du format du service.

Que faire si le mot de passe est trouvé​

  • Le changer immédiatement, partout où il est utilisé.
  • Ne plus jamais le réutiliser, même modifié légèrement : Soleil2025! est une variante de Soleil2024! que les attaquants essaient aussi.
  • Utiliser un gestionnaire de mots de passe, qui génère et retient un mot de passe unique par compte.
  • Activer la double authentification quand le service le propose.

Être absent de la base ne veut pas dire que le mot de passe est sûr : cela signifie seulement qu'il n'a pas (encore) fuité.

Pour aller plus loin

Pour une adresse e-mail, le site officiel haveibeenpwned.com liste les fuites connues. Une adresse est une donnée à caractère personnel : ne la saisissez que sur le site dont vous avez vous-même tapé l'adresse.


Test de mémorisation/compréhension​


Que signifie le fait qu'un mot de passe soit présent dans la base Pwned Passwords ?


Que contient la requête envoyée à l'API Pwned Passwords pour tester un mot de passe ?


Pourquoi le service renvoie-t-il environ 2 000 lignes pour une seule requête ?


Qui détermine si le mot de passe est présent dans la liste renvoyée ?


Pourquoi utilise-t-on printf '%s' plutôt que echo pour calculer l'empreinte avec sha1sum ?


Le mot de passe Soleil2024! contient une majuscule, des chiffres et un symbole, mais il est trouvé dans la base. Que faire ?


Un site vous propose de vérifier votre mot de passe en le saisissant en clair dans un formulaire. Quel est le risque ?


Pourquoi SHA-1, déconseillé pour vérifier un fichier, est-il acceptable pour interroger Pwned Passwords ?



Bonnes pratiques​

  • Vérifier un mot de passe sans l'envoyer en entier : seule la méthode du préfixe d'empreinte le permet.
  • Considérer un mot de passe trouvé dans une fuite comme inutilisable et le changer partout où il est utilisé.
  • Ne pas se fier aux règles de composition : un mot de passe avec majuscule, chiffre et symbole peut être déjà connu.
  • Utiliser un mot de passe unique par compte, généré par un gestionnaire de mots de passe.
  • Activer la double authentification pour que le mot de passe seul ne suffise plus.
  • Ne jamais taper un mot de passe dans une commande : il reste en clair dans l'historique du terminal (utiliser read -s).