Aller au contenu

4. Authentification đŸ”‘âš“ïžŽ

1. Les facteurs d'authentification⚓

‱ La connaissance 👉 JE CONNAIS
‱ La possession 👉 JE POSSEDE
‱ Les caractĂ©ristiques biomĂ©triques 👉 JE SUIS

source : https://www.apog.net/deploiement-solution-mfa-indispensable

2. Authentification simple : le mot de passe⚓

👉 facteur d'authentification : la connaissance

Source

2.1 A quoi sert un mot de passe ?⚓

‱ Accùs à des services en ligne grñce au contrîle d’accùs.
‱ ImputabilitĂ©, preuve de qui a fait quoi.
‱ TraçabilitĂ© des actions, historique des actions.

Exemple,
tĂ©lĂ©dĂ©claration de l’impĂŽt : imputabilitĂ© = lien entre la dĂ©claration et la personne ET traçabilitĂ© = connaĂźtre l’heure et la date de la dĂ©claration.

2.2 Les risques d'un mot de passe⚓

‱ Divulgation :

  • Par nĂ©gligence : faiblesse d’une personne, support amovible, diffusion Ă  un tiers.
  • Par un service non sĂ©curisĂ© : protocoles https, imaps, pop3s, etc
 Ă  privilĂ©gier.
  • Par l’utilisation d’un vecteur infectĂ©.
  • Mot de passe enregistrĂ© sans protection.

‱ Malveillance :

  • Authentification sur un service illĂ©gitime.
  • Attaque par ingĂ©nierie sociale, piĂšge.
  • Attaque par force brute ou divulgation d’une base de donnĂ©es mal sĂ©curisĂ©e.

‱ Ces deux cas de figure peuvent entraüner :

  • La compromission des messages personnels.
  • La destruction de donnĂ©es.
  • La publication de messages ou photos prĂ©judiciables sur les rĂ©seaux sociaux par exemple.
  • Des achats.
  • Des virements bancaires.

2.3 Craquer un mot de passe⚓

  • Par force brute
  • Par dictionnaire, en gĂ©nĂ©ral avant l’attaque par force brute
  • Par permutation en Ă©changeant des caractĂšres (exemple : E par 3 ou O par 0).

Mais un souci de temps ...

temps de craquage par force brute d'un mdp

2.4 Comment construire un mot de passe fort ?⚓

Le mot de passe doit apporter un niveau de sĂ©curitĂ© suffisant, c’est-Ă -dire difficile Ă  dĂ©couvrir par un attaquant dans un temps raisonnable Ă  l’aide d’outils automatisĂ©s de recherche qui mettent en oeuvre les diffĂ©rentes techniques d’attaque. Il doit ĂȘtre composĂ© au minimum de 10 caractĂšres et ceux-ci doivent ĂȘtre de tout type.

Préconisations ANSI

Créez un mot de passe suffisamment long, complexe et inattendu : de 8 caractÚres minimum et contenant des minuscules, des majuscules, des chiffres et des caractÚres spéciaux. source

Quelques astuces :

  • GrĂące Ă  une phrase de passe avec des mots concatĂ©nĂ©s.
  • Par phonĂ©tique.
  • Les premiĂšres lettres des mots d’une phrase, citation, chanson, etc

  • Mixer les trois mĂ©thodes.

Coffre fort

AUjourd'hui, rien de mieux que l'utilisation d'un coffre électronique de mot de passe (keypass, bitwarden, Cosy pass, ...) et la génération aléatoire de mot de passe complexe et unique par usage.
Seule prĂ©caution đŸ”„ : ne pas oublier le mot de passe du coffre fort ...

2.5 Les rainbows Tables⚓

2.5.1 À quoi sert une Rainbow Table ?⚓

Une Rainbow Table est un fichier volumineux contenant une multitude de mots de passe reliés à leur valeur de hachage (empreinte).

illustration hachage

Les cybercriminels s’en servent pour cracker des mots de passe. Les Rainbow Tables permettent gĂ©nĂ©ralement de rĂ©duire le temps et la mĂ©moire nĂ©cessaires Ă  l’attaque, contrairement aux attaques par force brute qui requiĂšrent beaucoup de temps et aux attaques par dictionnaires qui nĂ©cessitent beaucoup de mĂ©moire.

À noter que les Rainbow Table peuvent Ă©galement ĂȘtre utilisĂ©es par des experts en cybersĂ©curitĂ© pour identifier des failles ou effectuer des tests de sĂ©curitĂ©.

2.5.2 Comment fonctionne une Rainbow Table ?⚓

Lors de la gĂ©nĂ©ration d’une Table arc-en-ciel, chaque mot de passe est hachĂ© (le procĂ©dĂ© peut ĂȘtre rĂ©pĂ©tĂ© plusieurs fois en fonction des cas).

Seul le mot de passe initial et la valeur finale sont conservĂ©s dans la Table. Ce processus est ensuite rĂ©pĂ©tĂ© Ă  partir de nouveaux mots de passe, jusqu’à obtenir une Table importante.

Pour cracker un mot de passe, le cybercriminel va chercher son empreinte dans la Table arc-en-ciel. Une fois trouvée, il peut donc récupérer le mot de passe initial de cette empreinte.

Activité : Génération et utilisation d'une rainbow Table

rainbow Table

Etape 1 : génération d'une rainbow Table

Le projet Richelieu, créé par les développeurs Maxime Alay-Eddine et Paul Barbaste, établit une liste des mots de passe français les plus courants. Ceux-ci proviennent de fuites de données rendues publiques, filtrées sur les adresses e-mail en « .fr ».

Par simplication de performance, nous utiliserons un fichier réduit contenant les 1000 mots de passe français les plus utilisés ici.

construction de la rainbow Table

  • Ouverture et lecture du fichier txt french_passwords_top1000.txt
  • CrĂ©ation d'un dictionnaire clĂ©-valeur, dont la clĂ© est le mot de passe en clair et la valeur l'empreinte du mot de passe.
  • Pour chaque ligne, on calcule l'empreinte MD5 du mot de passe.
  • Ecriture d'un fichier CSV pour sauvegarder le dictionnaire
Correction
🐍 Python
import hashlib

# Dictionnaire pour stocker les mots de passe générés et leurs hachages MD5
passwords = {}

#ouverture du fichier contenant les mots de passe
with open("./data/french_passwords_top1000.txt", "r") as file:
    #pour chaque mot de passe, on créé un hachage MD5 et on stocke le mot de passe et son hachage dans le dictionnaire
    for line in file:   
        password = line.strip()
        password_hash = hashlib.md5(password.encode()).hexdigest()
        passwords[password] = password_hash 

#Sauvegarde des hachages dans un fichier
with open("./data/md5_passwords.csv", "w") as file:
    for password, hash in passwords.items():
        file.write(password + ';' +hash + "\n")

#fermeture du fichier
file.close()

Utilisation de la rainbow Table

Scénario : un utilisateur saisi un mot de passe dans un formulaire, qui est immédiatement chiffrer à l'aide l'algorithme MD5. Un hacker réussit grùce à une lecture de trame réseau à capter cette empreinte.

Activité supplémentaire :

Créer une fonction find_password qui prend en paramÚtre une rainbow Table sous forme de dictionnaire et une empreinte et qui retourne le mot de passe en clair ou "non trouvé" sinon.

  • Ouverture et lecture du fichier csv contenant la rainbow Table
  • Pour chaque ligne, comparaison de l'empreinte captĂ©e et de la valeur dans le dictionnaire.
  • Si on trouve l'empreinte, retournez le mot de passe en clair, sinon retournez "Non trouvĂ©"
Correction
🐍 Python
def find_password(passwords, hash):

    #On vérifie si le hachage est dans le dictionnaire
    if hash in passwords.values():
        #si le hachage est dans le dictionnaire, on affiche le mot de passe correspondant
        for password, password_hash in passwords.items():
            if password_hash == hash:
                return (f"Le mot de passe associé au hachage {hash} est {password}")
            #sinon on affiche que le mot de passe n'a pas été trouvé
    return(f"Le mot de passe associé au hachage {hash} n'a pas été trouvé")

hash = hashlib.md5("secret".encode()).hexdigest() #5ebe2294ecd0e0f08eab7690d2a6ee69
find_password(hash)

Exemple pour : 5ebe2294ecd0e0f08eab7690d2a6ee69

'Le mot de passe associé au hachage 5ebe2294ecd0e0f08eab7690d2a6ee69 est secret'

2.6 Stockage d'un mot de passe⚓

La rĂšgle de "base" en hygiĂšne de codeur est de ne JAMAiS stockĂ© un mot de passe en clair, que ce soit dans un fichier ou pire dans une base de donnĂ©es. Un site ne doit jamais ĂȘtre en capacitĂ© de vous communiquer votre mot de passe initial !

Le seul moment oĂč un mot de passe est en clair est quand il est saisi dans le champ du formulaire.
Imaginons ... Si tous les sites avaient tous la mĂȘme mĂ©thode de chiffrement (MD5 ou SH256) et qu'un utilisateur utilisait le mĂȘme mot de passe sur tous ces sites ...

Il existe des fuites de données recensant le couple identifiant/mot de passe d'un grand nombre de personne !
Vous pouvez tester votre adresse mail sur le site ';--have i been pwned? pour savoir si celle ci appartient à une fuite de données connue.

Mise en exemple :
Alphonse (al@mail.com) utilise le mot de passe "secret" pour les sites monsite.fr et concurrent.fr
Chacun des deux sites utilise la mĂȘme mĂ©thode de chiffrement MD5.
Donc chacun des deux sites possĂšdent dans sa base le couple al@mail.com et 5ebe2294ecd0e0f08eab7690d2a6ee69.
monsite.fr subit une attaque et une fuite de données massive.
le pirate possĂšde donc le moyen de se connecter Ă  concurrent.fr avec le compte d'alphonse...

C'est la que l'on introduit la notion de salage.

DĂ©finition : Le salage est un procĂ©dĂ© utilisĂ© en cryptographie pour renforcer la sĂ©curitĂ© des mots de passe stockĂ©s. Il consiste Ă  ajouter une valeur alĂ©atoire unique (appelĂ©e "sel" ou "salt") Ă  chaque mot de passe avant de le hacher. Cela rend plus difficile pour les attaquants d'utiliser des attaques par table arc-en-ciel ou par dictionnaire, car mĂȘme si deux utilisateurs ont le mĂȘme mot de passe, leurs hashs seront diffĂ©rents grĂące aux sels uniques.

illustration

🐍 Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import hashlib

# generate new salt, hash password
# h est le sel qui sera utilisé pour le hachage
h = b"monsite.fr"
# Hash du mot de passe classique sans salage
pwd_md5 = hashlib.md5(b"secret").hexdigest()
print(pwd_md5)
# Hash du mot de passe classique avec salage
pwd = hashlib.pbkdf2_hmac('md5', b"secret", h, 100000)
print(pwd)
📋 Texte
5ebe2294ecd0e0f08eab7690d2a6ee69
b'\xc3;K\xc2\xfb\xb4z\xca`f\xc4T\xc9I\x1b.'

3. L'authentification multi-facteur (MFA)đŸ”âš“ïžŽ

3.1 Introduction au MFA⚓

L’authentification multi-facteur (MFA) est une mĂ©thode de sĂ©curitĂ© qui exige l’utilisation d’au moins deux facteurs d’authentification diffĂ©rents pour accĂ©der Ă  un systĂšme ou une application. Elle permet de renforcer la sĂ©curitĂ© en rendant beaucoup plus difficile l’usurpation d’identitĂ©.

source : https://www.apog.net/deploiement-solution-mfa-indispensable

Exemple⚓

  • Authentification simple : identifiant + mot de passe.
  • Authentification multi-facteur : identifiant + mot de passe et code Ă  usage unique envoyĂ© par SMS ou gĂ©nĂ©rĂ© par une application mobile.

👉 Objectif : limiter les risques en cas de vol ou de fuite de mot de passe.

Limites du mot de passe seul⚓

  • Attaques par force brute (essais massifs de combinaisons).
  • RĂ©utilisation d’un mĂȘme mot de passe sur plusieurs sites.
  • Phishing (vol par fausse page de connexion).

Le MFA répond à ces problÚmes en ajoutant une seconde barriÚre.

3.2 Les principaux mĂ©canismes MFA⚓

Les dĂ©veloppeurs disposent de plusieurs solutions pour mettre en Ɠuvre l’authentification multi-facteur.

a) OTP (One-Time Password)⚓

  • TOTP (Time-based One-Time Password) : mot de passe temporaire, gĂ©nĂ©rĂ© toutes les 30 secondes (ex. Google Authenticator, Authy, FreeOTP).
  • HOTP (HMAC-based One-Time Password) : mot de passe unique basĂ© sur un compteur.

➕ Avantage : ne nĂ©cessite pas de connexion Internet.

b) SMS ou e-mail⚓

  • Envoi d’un code Ă  usage unique par SMS ou e-mail.
  • Simple Ă  mettre en place, mais vulnĂ©rable (interception SMS, piratage boĂźte mail, SIM swapping).

c) Applications mobiles d’authentification⚓

  • GĂ©nĂ©ration de codes via des applis comme Microsoft Authenticator ou Google Authenticator.
  • Fonctionnent mĂȘme hors ligne.
  • Solution robuste et gratuite.

d) ClĂ©s physiques (U2F / FIDO2 / YubiKey)⚓

  • Dispositifs USB ou NFC servant de second facteur.

➕ TrĂšs sĂ©curisĂ©s (rĂ©sistent au phishing et aux attaques distantes).
➖ Limite : coĂ»t d’achat du matĂ©riel.

e) Notifications push⚓

  • Une demande de validation est envoyĂ©e directement sur le smartphone de l’utilisateur.
  • Exemple : connexion Ă  un compte Google → “Accepter la connexion ?” ou github → se connecter Ă  l'application

➕ Confortable pour l’utilisateur, mais ➖ nĂ©cessite un smartphone connectĂ©.

4. Mise en Ɠuvre cĂŽtĂ© dĂ©veloppeur⚓

Un développeur doit savoir intégrer du MFA dans ses applications.
L’exemple le plus simple est le TOTP avec une application mobile comme Google Authenticator.

Principe⚓

  1. Le serveur génÚre une clé secrÚte unique pour chaque utilisateur.
  2. L’utilisateur scanne un QR code dans son application d’authentification.
  3. Lors de la connexion, le serveur vĂ©rifie le code gĂ©nĂ©rĂ© par l’application.

Exemple avec Python⚓

🐍 Python
import pyotp
import qrcode

# Étape 1 : GĂ©nĂ©rer un secret unique pour un utilisateur
secret = pyotp.random_base32()
print("Secret partagé :", secret)

# Étape 2 : GĂ©nĂ©rer un QR Code compatible Google Authenticator
uri = pyotp.totp.TOTP(secret).provisioning_uri(
    name="etudiant@bts-sio.fr",
    issuer_name="DemoMFA"
)
qrcode.make(uri).show()

# Étape 3 : VĂ©rification lors de la connexion
totp = pyotp.TOTP(secret)
code = input("Entrez le code affiché par votre application: ")
if totp.verify(code):
    print("✅ Authentification rĂ©ussie")
else:
    print("❌ Code invalide")

👉 A faire :

  • Lancer ce script.
  • Scanner le QR code avec Google Authenticator.
  • Tester la saisie d’un code valide.

Bonnes pratiques 👑

  • Toujours combiner MFA avec un mot de passe fort.
  • Éviter l’usage du SMS seul (faible sĂ©curitĂ©).
  • PrĂ©voir des codes de secours pour l’utilisateur.
  • Mettre en place une procĂ©dure de rĂ©cupĂ©ration sĂ©curisĂ©e.
  • Ne jamais stocker les clĂ©s secrĂštes en clair (utiliser un chiffrement).

✅ RĂ©sumĂ©

L’authentification multi-facteur est une mesure de sĂ©curitĂ© indispensable.
Elle peut ĂȘtre mise en Ɠuvre facilement par les dĂ©veloppeurs via des solutions comme TOTP et amĂ©liore grandement la sĂ©curitĂ© des applications contre les attaques les plus courantes.

5. DĂ©tection et stratĂ©gie d'authentification sĂ©curisĂ©e⚓

Scénario 1 : Paul, un peu fatigué, galÚre à se connecter à son site web favori. Il en est à sa troisiÚme tentative.
ScĂ©nario 2 : Pierre tente une attaque par force brut sur le mĂȘme site web en utilisant une attaque par permutation.

5.1 Principes gĂ©nĂ©raux⚓

  • DĂ©tecter : mesurer tentatives par compte, par IP, et par couple IP+compte.
  • RĂ©agir graduellement (dĂ©fense en profondeur) : ne pas verrouiller immĂ©diatement l’utilisateur lĂ©gitime, mais rendre l’attaque coĂ»teuse.
  • Journaliser & alerter : conserver logs (IP, user agent, timestamp, rĂ©sultat) et dĂ©clencher alertes si pic anormal.
  • Ne pas divulguer d’information : messages gĂ©nĂ©riques (« Identifiants incorrects ») pour Ă©viter l’énumĂ©ration d’utilisateurs.
  • PrĂ©voir remĂ©diation : procĂ©dure assistĂ©e pour utilisateur lĂ©gitime (codes secours, support).

5.2 StratĂ©gie recommandĂ©e (dĂ©fense en couches — ordonnĂ©e par prioritĂ©)⚓

1.Limiter les tentatives par compte (user)

  • Objectif : empĂȘcher un attaquant d’utiliser une attaque par force brut.
  • Toujours enregistrer failed_attempts, last_failed_at, lock_until.
  • Politique conseillĂ©e (exemple) :

    • 0–4 Ă©checs consĂ©cutifs : rien.
    • 5–9 Ă©checs : afficher CAPTCHA + dĂ©lai progressif (ex. 2s → 4s → 8s).
    • ≄10 Ă©checs : verrouillage temporaire du compte 15 minutes.
    • ≄20 Ă©checs : verrouillage plus long (24 h) + notification par email.

2.Limiter les tentatives par IP

  • Objectif : ralentir les attaques distribuĂ©es depuis une mĂȘme IP (ou NAT).
  • Exemples :

    • 100 tentatives par IP / heure → challenge CAPTCHA.
    • 500 tentatives par IP / heure → blocage temporaire IP (ex. 1 heure) ou rate-limit au proxy/WAF.

⚠ Attention au NAT/partage : soyez pondĂ©rĂ© (ne pas bloquer un domaine entier).

3.Limiter par couple IP+username

  • EmpĂȘche un attaquant distribuĂ© d’attaquer un seul compte depuis plusieurs IP sans coĂ»t.
  • Par ex. 20 tentatives IP+user en 1 heure → bloqueo temporaire pour ce couple.

4.Progressive delays / exponential backoff

  • AprĂšs chaque Ă©chec, ajouter un dĂ©lai croissant cĂŽtĂ© serveur avant de rĂ©pondre (p. ex. 0s, 1s, 2s, 4s, 8s).
  • Plus efficace et moins disruptif qu’un blocage immĂ©diat.

5.CAPTCHA / challenge adaptatif

  • Afficher un CAPTCHA aprĂšs X Ă©checs ou comportement suspect.
  • Utile pour diffĂ©rencier bot / humain.
  • PrĂ©fĂ©rer des CAPTCHAs modernes (reCAPTCHA v3 ou invisible) pour UX.

6.Verrouillage Ă  double sens & codes de secours

  • Si compte verrouillĂ©, envoyer email avec lien de dĂ©verrouillage (avec OTP) ou codes de secours prĂ©-gĂ©nĂ©rĂ©s.
  • Ne jamais envoyer le secret MFA ou mot de passe.

7.Surveillance & alerting

  • Surveiller pics d’échecs, login success aprĂšs Ă©checs rĂ©pĂ©tĂ©s, pattern d’énumĂ©ration.
  • Alerter SOC / admin quand seuils critiques franchis.

5.2 UX & sĂ©curitĂ© : rĂšgles pratiques⚓

  • Messages gĂ©nĂ©riques : « Identifiants incorrects. » Ne dire ni « email inconnu » ni « mot de passe incorrect ».
  • ProcĂ©dure support : autoriser un canal support pour dĂ©verrouiller aprĂšs vĂ©rifs (ne pas faire de verrouillage permanent sans recours) : mail, SMS, ...
  • Pas de lockout permanent : privilĂ©gier lockout temporaire, puis escalade.
  • Notifiez l’utilisateur (email) en cas de verrouillage prolongĂ© ou d’activitĂ©s suspectes.

Il faut arbitrer entre la sécurité et le confort des utilisateurs. Il ne s'agit pas de faire fuire ces derniers avec un processus de connexion/récupération trop compliqué.

ParamÚtres conseillés (à adapter selon contexte)
  • Tentatives consĂ©cutives tolĂ©rĂ©es avant challenge : 5
  • Tentatives avant verrouillage temporaire : 10
  • DurĂ©e lockout temporaire : 15 minutes
  • DurĂ©e lockout prolongĂ© (abuse confirmĂ©) : 24 heures
  • FenĂȘtre pour compter tentatives (sliding window) : 15–60 minutes
  • Rate limit IP (soft) : 100–200 req/h sur endpoint /login
  • Window IP+user : 20 tentatives / heure → blocage
Outils & composants utiles
  • Reverse proxy / WAF: Nginx limit_req, Cloudflare Rate Limiting, AWS WAF.
  • fail2ban: pour bloquer IPs aprĂšs patterns d’échec (utile si logs accessibles).
  • Redis: pour compteurs et token bucket (rate limiting).
  • reCAPTCHA / hCaptcha: pour challenge adaptatif.
  • SIEM / ELK: agrĂ©gation logs + alertes.
  • Services anti-bot / Bot-management (Cloudflare Bot Management, Akamai).

checklist à appliquer 📋

  • Compteurs par user, par IP, et IP+user.
  • StratĂ©gie progressive : CAPTCHA → Retard → Lock temporaire → Lock long.
  • Messages gĂ©nĂ©riques pour Ă©viter l’énumĂ©ration.
  • ProcĂ©dure de rĂ©cupĂ©ration & notifications.
  • Logging centralisĂ© + alertes.
  • Rate-limiting aussi au niveau infra (WAF / reverse proxy).
  • Tester les faux positifs & l’impact sur utilisateurs lĂ©gitimes.