Plateforme de Cryptographie Par Kaci AMAOUCHE

Exercices - Chapitre 5: Authentification

Mettez en pratique vos connaissances sur les méthodes d'authentification sécurisées

Exercice 5.1 : Authentification par mot de passe

Le stockage sécurisé des mots de passe est essentiel pour protéger les données des utilisateurs. Dans cet exercice, vous allez implémenter et analyser différentes méthodes de stockage de mots de passe.

Partie A : Analyse de code

Examinez le code suivant qui implémente un système d'authentification basique :


import sqlite3
import hashlib

class UserAuth:
    def __init__(self, db_path='users.db'):
        self.conn = sqlite3.connect(db_path)
        self.create_table()
    
    def create_table(self):
        cursor = self.conn.cursor()
        cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY,
            username TEXT UNIQUE,
            password TEXT,
            email TEXT
        )
        ''')
        self.conn.commit()
    
    def register_user(self, username, password, email):
        # Hash the password using MD5
        hashed_password = hashlib.md5(password.encode()).hexdigest()
        
        cursor = self.conn.cursor()
        try:
            cursor.execute(
                "INSERT INTO users (username, password, email) VALUES (?, ?, ?)",
                (username, hashed_password, email)
            )
            self.conn.commit()
            return True
        except sqlite3.IntegrityError:
            return False
    
    def authenticate_user(self, username, password):
        # Hash the provided password
        hashed_password = hashlib.md5(password.encode()).hexdigest()
        
        cursor = self.conn.cursor()
        cursor.execute(
            "SELECT * FROM users WHERE username = ? AND password = ?",
            (username, hashed_password)
        )
        user = cursor.fetchone()
        return user is not None

Identifiez au moins cinq problèmes de sécurité dans ce code et expliquez comment les corriger.

Partie B : Implémentation sécurisée

Réimplémentez la fonction register_user et authenticate_user en utilisant des techniques modernes et sécurisées de stockage de mots de passe.

Partie C : Authentification multi-facteurs

Proposez une extension de la classe UserAuth pour implémenter une authentification à deux facteurs basée sur des codes TOTP (Time-based One-Time Password). Expliquez comment vous intégreriez cette fonctionnalité et quelles bibliothèques Python vous utiliseriez.

Exercice 5.2 : Infrastructure à clé publique (PKI)

Les infrastructures à clés publiques (PKI) sont essentielles pour l'établissement de la confiance dans les communications numériques. Dans cet exercice, vous allez créer et gérer une PKI simple.

Partie A : Création d'une autorité de certification (CA)

Écrivez un script Python qui crée une autorité de certification racine, en générant une paire de clés RSA et un certificat auto-signé. Le script doit permettre de spécifier les informations suivantes pour le certificat :

  • Nom commun (CN)
  • Organisation (O)
  • Pays (C)
  • Durée de validité

Partie B : Émission de certificats

Étendez votre script pour permettre à l'autorité de certification de générer et signer des certificats pour d'autres entités (par exemple, des serveurs ou des utilisateurs). Le script doit :

  1. Générer une paire de clés pour l'entité
  2. Créer une demande de signature de certificat (CSR)
  3. Signer la CSR avec la clé privée de la CA
  4. Enregistrer le certificat signé

Partie C : Révocation et vérification

Complétez votre script avec des fonctionnalités pour :

  1. Révoquer un certificat en ajoutant son numéro de série à une liste de révocation de certificats (CRL)
  2. Générer et publier la CRL
  3. Vérifier si un certificat est valide (non expiré et non révoqué)
  4. Vérifier la chaîne de confiance d'un certificat

Exercice 5.3 : Authentification à deux facteurs

L'authentification à deux facteurs (2FA) est devenue un standard de sécurité pour protéger les comptes contre les compromissions de mot de passe. Dans cet exercice, vous allez implémenter un système TOTP (Time-based One-Time Password).

Partie A : Implémentation TOTP

Créez une classe Python qui implémente la génération et la vérification de codes TOTP selon la norme RFC 6238. La classe doit fournir les fonctionnalités suivantes :

  1. Génération d'une clé secrète aléatoire
  2. Génération d'un code TOTP à partir de la clé secrète
  3. Vérification d'un code TOTP fourni par l'utilisateur
  4. Génération d'une URI pour QR code compatible avec les applications d'authentification (Google Authenticator, Authy, etc.)

Partie B : Intégration avec le système d'authentification

Étendez le système d'authentification de l'exercice 5.1 pour intégrer l'authentification à deux facteurs en ajoutant :

  1. Un processus d'enregistrement 2FA pour les utilisateurs
  2. La possibilité d'activer/désactiver la 2FA pour un compte
  3. Une étape de vérification TOTP dans le processus de connexion
  4. Des codes de secours pour la récupération de compte

Partie C : Sécurité et expérience utilisateur

Réfléchissez aux compromis entre sécurité et expérience utilisateur dans l'authentification à deux facteurs. Répondez aux questions suivantes :

  1. Quels sont les avantages et les inconvénients des différentes méthodes de 2FA (TOTP, SMS, email, clés physiques) ?
  2. Comment gérer le cas où un utilisateur perd accès à son appareil d'authentification ?
  3. Quelles stratégies pourriez-vous mettre en place pour encourager l'adoption de la 2FA par les utilisateurs ?

Ressources complémentaires

Conseils de réussite

Les exercices de ce chapitre sont particulièrement pertinents pour les applications du monde réel. Les compétences acquises ici peuvent être directement appliquées à des projets de développement web.

Pour l'exercice 5.1, assurez-vous de comprendre les bonnes pratiques actuelles en matière de stockage de mots de passe. Les recommandations évoluent avec le temps à mesure que de nouvelles vulnérabilités sont découvertes.

Pour l'exercice 5.2, la gestion des certificats est un domaine complexe. N'hésitez pas à consulter des ressources supplémentaires sur les PKI pour approfondir votre compréhension.

Pour l'exercice 5.3, testez votre implémentation TOTP avec des applications réelles comme Google Authenticator pour vérifier sa compatibilité.