La double authentification : fabriquer soi-même un code à 6 chiffres
Pourquoi le code de votre application change-t-il toutes les 30 secondes ? Le mieux pour le comprendre est de le fabriquer
Petite vérification
Avant de commencer, vérifiez si vous savez encore répondre à ces 3 questions très simples, sur la séance consacrée à l'attaque de l'homme du milieu :
- citer le nom du fichier qui jouait le rôle d'intermédiaire actif entre le client et
serveur.py - expliquer en quoi ce relais se distingue de
tcpdump - citer la protection qui résiste même à un attaquant placé au milieu de l'échange
📌 Réponse attendue
TP pour réfléchir et résoudre des problèmes
Votre défi pour aujourd'hui consiste à fabriquer vous-même un code à usage unique, puis à vérifier ce qu'il protège réellement
L'agence de voyages Horizon, son compte emma et son mot de passe sont fictifs, construits pour
l'exercice. Créez un dossier tp-2fa et placez-vous dedans. Les commandes utilisent python3 (sous
Windows, utilisez python).
Étape 1 — Découper le temps en tranches de 30 secondes
Le code d'une application d'authentification change toutes les 30 secondes. Avant de le calculer,
observez le nombre qui sert de point de départ : le numéro de la tranche de 30 secondes dans
laquelle on se trouve. Lancez l'interpréteur Python (python3), puis saisissez :
import time
print(int(time.time() // 30))
Relancez la dernière ligne 2 ou 3 fois, en patientant quelques secondes entre chaque essai, puis
calculez à la main les numéros de tranche des instants 59 et 60 (en secondes) :
print(int(59 // 30), int(60 // 30))
- Le nombre affiché change-t-il à chaque essai ? Pourquoi ?
- Quels sont les numéros de tranche des instants
59et60?
📌 Réponse attendue
Étape 2 — Calculer le code à 6 chiffres
Créez le fichier totp.py avec le contenu ci-dessous. Le secret partagé est la valeur que le
serveur et l'application connaissent tous les deux. Complétez les 2 lignes marquées
# À COMPLÉTER :
import base64
import hashlib
import hmac
import struct
import time
SECRET = "JBXXE2L2N5XC2VTPPFQWOZLTFUZDAMRV" # secret partagé (codé en base32)
def totp(secret, instant, pas=30):
cle = base64.b32decode(secret)
compteur = ... # À COMPLÉTER : numéro de la tranche de 30 s
message = struct.pack(">Q", compteur)
empreinte = hmac.new(cle, message, hashlib.sha1).digest()
decalage = empreinte[-1] & 0x0F
nombre = struct.unpack(">I", empreinte[decalage:decalage + 4])[0] & 0x7FFFFFFF
return ... # À COMPLÉTER : 6 derniers chiffres, avec des 0 devant si besoin
if __name__ == "__main__":
for instant in (1700000000, 1700000009, 1700000010, 1700000070):
print(instant, totp(SECRET, instant))
print("maintenant", totp(SECRET, time.time()))
Lancez python3 totp.py.
- Quels codes obtenez-vous pour les instants
1700000000,1700000009,1700000010et1700000070? - Pourquoi les deux premiers codes sont-ils identiques, alors que le troisième est différent ?
📌 Réponse attendue
Option : saisissez la valeur de SECRET dans une application d'authentification (saisie manuelle
de la clé, type « basé sur le temps »). Elle affiche, au même moment, le même code que la ligne
maintenant de votre script : c'est exactement ce calcul qu'elle effectue.
Étape 3 — Vérifier qu'un mot de passe volé ne suffit plus
Ajoutez dans totp.py, juste avant le bloc if __name__ == "__main__":, la fonction ci-dessous,
qui simule la page de connexion de l'agence Horizon :
MOT_DE_PASSE = "Voyage2025!"
def connexion(mot_de_passe, code, instant):
if mot_de_passe != MOT_DE_PASSE:
return "Refusé : mot de passe incorrect"
if code != totp(SECRET, instant):
return "Refusé : code incorrect ou expiré"
return "Accès accordé"
Un attaquant a retrouvé le mot de passe d'Emma dans une fuite de données. Testez ces 3 situations
(à l'instant 1700000000, par exemple dans l'interpréteur après from totp import *) :
print(connexion("Voyage2025!", "000000", 1700000000))
print(connexion("Voyage2025!", "962458", 1700000000))
print(connexion("Voyage2025!", "962458", 1700000040))
- Que répond la page de connexion dans chacun des 3 cas ?
- Que montre le troisième cas sur la durée de vie d'un code ?
📌 Réponse attendue
Étape 4 — Repérer la limite : le relais en direct
Reprenez ce que vous avez appris sur le relais proxy.py de la séance sur l'homme du milieu.
Emma reçoit un faux message de l'agence Horizon et saisit son mot de passe et son code sur un
faux site de connexion. Ce faux site transmet immédiatement les deux valeurs au vrai site, comme le
ferait proxy.py.
- Pourquoi un simple
tcpdumpqui enregistrerait le code pour s'en servir plus tard ne fonctionnerait-il pas ? - Pourquoi le faux site, lui, peut-il malgré tout se connecter à la place d'Emma ?
- Quelle précaution de l'utilisatrice empêche ce scénario ?
📌 Réponse attendue
Étape 5 — Répondre à une objection
Le responsable de l'agence Horizon hésite à rendre la double authentification obligatoire : « c'est une contrainte pour les équipes, et mon mot de passe est déjà très long ». Que lui répondez-vous ?
Restitution orale
Un étudiant (ou un binôme) vient présenter au tableau le fonctionnement du code à 6 chiffres qu'il a fabriqué (étapes 1 à 3) et la limite repérée à l'étape 4.
- 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 :
- expliquer d'où vient le code et pourquoi il change toutes les 30 secondes ;
- présenter ce que prouvent les 3 tests de l'étape 3, puis la limite du relais en direct ;
- répondre aux questions de la classe.
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 venez de fabriquer un code à usage unique. Il reste à replacer ce geste dans la logique plus large de l'authentification.
Un seul facteur, c'est un seul point de défaillance
Prouver son identité peut se faire de trois façons, appelées facteurs d'authentification :
| Facteur | Principe | Exemples |
|---|---|---|
| Ce que vous savez | Une information secrète | Mot de passe, code PIN |
| Ce que vous possédez | Un objet que vous détenez | Téléphone, clé de sécurité, carte à puce |
| Ce que vous êtes | Une caractéristique personnelle | Empreinte digitale, visage |
La double authentification (2FA) combine deux facteurs de natures différentes. Deux mots de passe, ou un mot de passe suivi d'une question secrète, restent un seul facteur : ils relèvent tous deux de ce que vous savez.
Les 3 familles de facteurs vous seront utiles pour reconnaître, dans un audit, ce qui relève vraiment d'une authentification renforcée.
Comment est calculé un code TOTP
Le code de l'étape 2 est un TOTP (Time-based One-Time Password, mot de passe à usage unique basé sur le temps, standardisé par la RFC 6238). Le principe tient en trois éléments :
- un secret partagé, communiqué une seule fois au moment de l'activation (souvent sous forme de QR code) et stocké côté serveur et dans l'application ;
- l'heure, découpée en tranches de 30 secondes (le compteur de l'étape 1) ;
- une fonction de hachage à clé (HMAC) qui transforme le secret et le compteur en un nombre, dont on garde les 6 derniers chiffres.
Le serveur et l'application calculent chacun de leur côté, sans rien échanger : aucune connexion réseau n'est nécessaire pour que le code s'affiche sur le téléphone.
Le secret partagé joue le rôle d'un mot de passe : celui qui le possède peut fabriquer tous les codes. Ne le photographiez pas et ne le partagez jamais, à l'activation comme après.
Pourquoi 30 secondes, et pas une heure ?
Plus un code reste valable longtemps, plus un attaquant qui l'intercepte a de temps pour s'en servir. La durée de 30 secondes est un compromis : assez longue pour que l'utilisateur le recopie, assez courte pour qu'un code rejoué plus tard soit refusé (cas 3 de l'étape 3). Les serveurs acceptent souvent aussi la tranche précédente ou suivante, pour tolérer un léger décalage d'horloge.
Ce que la double authentification protège... et ce qu'elle ne protège pas
| Situation | Protégé par un code TOTP ? |
|---|---|
| Mot de passe retrouvé dans une fuite de données, ou réutilisé sur un autre site | Oui : le mot de passe seul ne suffit plus |
| Mot de passe deviné par dictionnaire (comme dans la séance sur le craquage) | Oui |
| Faux site qui relaie en direct le mot de passe et le code (étape 4) | Non : le code est valable quelques secondes |
| Téléphone infecté par un logiciel malveillant qui lit les codes | Non |
| Utilisateur persuadé de communiquer son code à un faux « support technique » | Non |
Un code à 6 chiffres est personnel : aucun support technique légitime ne vous le demande, que ce soit par téléphone, par SMS ou par e-mail.
Quel second facteur choisir ?
| Second facteur | Atout | Limite |
|---|---|---|
| Code reçu par SMS | Aucun logiciel à installer | Peut être intercepté ou détourné (par exemple par le détournement de la carte SIM) |
| Application d'authentification (TOTP) | Fonctionne hors connexion, plus difficile à détourner qu'un SMS | Le code peut être relayé en direct par un faux site |
| Clé de sécurité physique (FIDO2) | La réponse est liée au nom de domaine du vrai site : un faux site n'obtient rien | Objet à acheter, à ne pas perdre (prévoir une clé de secours) |
Quel que soit le choix, activez la double authentification en priorité sur la messagerie (qui permet de réinitialiser tous les autres mots de passe) et sur les comptes aux droits étendus.
Le standard est décrit dans la RFC 6238 (TOTP: Time-Based One-Time Password Algorithm). Les codes de secours remis à l'activation permettent de récupérer un compte en cas de perte du téléphone : rangez-les comme un mot de passe.
Test de mémorisation/compréhension
Bonnes pratiques
- Activer la double authentification partout où elle existe, en priorité sur la messagerie et sur les comptes aux droits étendus.
- Combiner deux facteurs de natures différentes : deux mots de passe ne font pas une double authentification.
- Protéger le secret partagé et les codes de secours comme un mot de passe, et les ranger hors du téléphone.
- Ne jamais communiquer un code à 6 chiffres, même à une personne qui se présente comme le support technique.
- Vérifier l'adresse du site avant de saisir un mot de passe et un code : un faux site peut relayer les deux en direct.
- Préférer une clé de sécurité (FIDO2) aux SMS quand le service le propose, car elle résiste au phishing.