Security musings

Catégories

Tags

🔍 Licence d'Utilisation 🔍

Sauf mention contraire, le contenu de ce blog est sous licence CC BY-NC-ND 4.0.

© 2025 à 2042 Sébastien Gioria. Tous droits réservés.

Soyons honnêtes : le mot de passe est une aberration technologique en 2025. Nous demandons à des humains de mémoriser des chaînes complexes, uniques pour chaque site, et de ne jamais les écrire. Résultat ? Ils mettent P@ssword123! partout.

Le problème racine : Le secret partagé

Le défaut fondamental du mot de passe, c’est qu’il s’agit d’un secret partagé. Pour vérifier que vous êtes vous, je dois connaître votre secret (ou son empreinte). Si mon serveur est compromis, votre secret l’est aussi.

Les 3 Cavaliers de l’Apocalypse

  • Credential Stuffing : Puisque les utilisateurs réutilisent leurs mots de passe, une fuite sur un site de e-commerce lambda permet aux attaquants de se connecter à votre compte bancaire ou votre VPN d’entreprise.
  • Phishing & Evilginx : Vous pensez que le MFA par SMS vous protège ? C’est insuffisant. Des outils comme Evilginx2 agissent comme des proxies inverses. Ils interceptent le mot de passe ET le code SMS en temps réel, récupèrent le cookie de session, et vous redirigent vers le vrai site. Vous n’avez rien vu.
  • MFA Fatigue : L’attaquant bombarde votre téléphone de notifications “Approuver la connexion ?”. À 3h du matin, fatigué, vous finissez par cliquer sur “Oui”.

L’erreur de code classique

En tant que développeurs, on pense souvent bien faire :

import hashlib

# ❌ NE FAITES JAMAIS ÇA
def check_password(stored_hash, plain_password):
    # SHA-256 est trop rapide ! Un GPU peut tester des milliards de combinaisons/seconde.
    return stored_hash == hashlib.sha256(plain_password.encode()).hexdigest()

Même avec un “salt”, les algorithmes rapides (SHA, MD5) sont vulnérables. Si vous devez absolument gérer des mots de passe, utilisez Argon2 ou BCrypt.

import bcrypt
# ✅ MIEUX
def hash_password(plain_password):
    salt = bcrypt.gensalt()
    hashed = bcrypt.hashpw(plain_password.encode(), salt)
    return hashed

def check_password(stored_hash, plain_password):
    try:
        if bcrypt.checkpw(plain_password.encode(), stored_hash):
            return True
    except:
        return False
    return False

La solution : Abandonner le mot de passe

Il est temps d’adopter des méthodes d’authentification modernes :

  • Passkeys (WebAuthn/FIDO2) : Utilisez des clés publiques/privées. Le serveur ne stocke qu’une clé publique, rendant les fuites inutiles.
  • Délégation d’authentification (OAuth2) : Confiez l’authentification à des géants comme Google ou Microsoft qui investissent massivement dans la sécurité.
  • Authentification biométrique : Utilisez les capteurs d’empreintes ou de visage intégrés aux appareils.
  • Authentification sans mot de passe : Des solutions comme Magic.link permettent une connexion via email ou SMS sans jamais utiliser de mot de passe.
  • Authentification adaptative : Analysez le contexte (localisation, appareil, comportement) pour ajuster les exigences d’authentification en temps réel.
  • Zero Trust : Ne faites jamais confiance par défaut. Vérifiez continuellement l’identité et le contexte.

Arrêter de gérer des secrets. C’est l’objet de notre prochain article sur la délégation d’authentification.

  • Lecture recommandée : NIST SP 800-63B (La bible de l’identité numérique).