Aller au contenu principal

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 :

  1. citer le nom du fichier qui jouait le rôle d'intermédiaire actif entre le client et serveur.py
  2. expliquer en quoi ce relais se distingue de tcpdump
  3. 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

info

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))
  1. Le nombre affiché change-t-il à chaque essai ? Pourquoi ?
  2. Quels sont les numéros de tranche des instants 59 et 60 ?
📌 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.

  1. Quels codes obtenez-vous pour les instants 1700000000, 1700000009, 1700000010 et 1700000070 ?
  2. Pourquoi les deux premiers codes sont-ils identiques, alors que le troisième est différent ?
📌 Réponse attendue
info

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))
  1. Que répond la page de connexion dans chacun des 3 cas ?
  2. 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.

  1. Pourquoi un simple tcpdump qui enregistrerait le code pour s'en servir plus tard ne fonctionnerait-il pas ?
  2. Pourquoi le faux site, lui, peut-il malgré tout se connecter à la place d'Emma ?
  3. 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.
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 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 :

FacteurPrincipeExemples
Ce que vous savezUne information secrèteMot de passe, code PIN
Ce que vous possédezUn objet que vous détenezTéléphone, clé de sécurité, carte à puce
Ce que vous êtesUne caractéristique personnelleEmpreinte 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.

info

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 :

  1. 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 ;
  2. l'heure, découpée en tranches de 30 secondes (le compteur de l'étape 1) ;
  3. 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.

attention

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​

SituationProtégé par un code TOTP ?
Mot de passe retrouvé dans une fuite de données, ou réutilisé sur un autre siteOui : 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 codesNon
Utilisateur persuadé de communiquer son code à un faux « support technique »Non
attention

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 facteurAtoutLimite
Code reçu par SMSAucun logiciel à installerPeut ê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 SMSLe 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 rienObjet à 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.

Pour aller plus loin

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​


Qu'est-ce qui caractérise une véritable double authentification ?


Que représente le « secret partagé » d'un code TOTP ?


D'après le TP, pourquoi les instants 1700000000 et 1700000009 donnent-ils le même code ?


Quelle est la durée de validité d'un code TOTP standard ?


Un attaquant a récupéré le mot de passe d'un utilisateur dans une fuite de données. Le code TOTP le protège-t-il ?


Pourquoi un attaquant placé au milieu (MITM) peut-il malgré tout contourner un code TOTP ?


Parmi ces seconds facteurs, lequel résiste le mieux à un faux site de phishing ?


Un « support technique » vous appelle et vous demande le code à 6 chiffres affiché par votre application. Que faites-vous ?



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.