2025-12-18 15:23:38 +01:00
2025-12-18 15:23:38 +01:00
2025-12-18 15:23:38 +01:00
2025-12-18 15:23:38 +01:00
2025-12-18 15:23:38 +01:00
2025-12-18 15:23:38 +01:00
2025-12-18 15:23:38 +01:00
2025-12-18 15:23:38 +01:00

Démonstration : sécurisation des mots de passe (MD5 vs Argon2)

Objectif

Comprendre pourquoi les algorithmes de hachage rapides comme MD5 ne doivent jamais être utilisés pour stocker des mots de passe. Implémenter la méthode moderne et sécurisée, Argon2id, de manière asynchrone pour ne pas bloquer le serveur.

Nous allons utiliser le routeur routes/users.js de notre application Express.

Voici un aperçu du flux général de l'application utilisateur → serveur :

flowchart TD
    client["client http"]
    router["routes /users"]
    md5["route /users/register-bad hash md5"]
    argon["route /users/register-good hash argon2id"]

    client --> router
    router --> md5
    router --> argon

Étape 1 : L'erreur (MD5) - ne faites pas ça ! (register)

L'objectif ici est de simuler ce qu'il ne faut pas faire.

Ouvrez le fichier routes/users.js et constatez que la route POST /users/register-bad est déjà créée pour vous.

Elle utilise l'algorithme de hachage MD5, qui est inadapté pour les mots de passe :

// Indice pour le hachage MD5
const hash = crypto.createHash('md5').update(password).digest('hex');

Étape 2 : La preuve du danger (register)

  1. Démarrez votre serveur Express :
    nodemon ./bin/www
    
  2. Avec un outil comme Postman, faites un appel POST sur http://localhost:3000/users/register-bad avec le JSON suivant :
    {
      "username": "testeur",
      "password": "123456"
    }
    
  3. Notez le hash renvoyé. (Il devrait être e10adc3949ba59abbe56e057f20f883e. Vous pouvez le confirmer également via ce site : https://www.md5hashgenerator.com/).
  4. Allez sur le site crackstation.net.
  5. Collez ce hash dans leur outil. Que se passe-t-il ?

Étape 3 : la correction (Argon2id Asynchrone)

Maintenant, implémentons la bonne pratique. Argon2 est conçu pour être lent et gourmand en mémoire, le rendant résistant aux attaques. Nous devons absolument l'utiliser en asynchrone pour ne pas bloquer le thread principal de Node.js.

  1. Installez la bibliothèque recommandée :
    npm install argon2
    
  2. Dans routes/users.js, importez argon2 :
    const argon2 = require('argon2');
    
  3. Complétez la route POST /users/register-good :
    • Cette route doit être async.
    • Récupérez username et password depuis req.body.
    • Utilisez await argon2.hash(...) pour hacher le mot de passe.
    • Utilisez un bloc try...catch pour gérer les erreurs de hachage.
    • Renvoie le nouveau hachage sécurisé.
sequenceDiagram
    participant c as client
    participant u as route /register-good
    participant a as argon2id

    c->>u: envoie username + password
    u->>a: "hash du mot de passe"
    a-->>u: "hash argon2id"
    u-->>c: "hash retourné"

Étape 4 : la vérification (login)

Pour un cycle complet, testez les routes de connexion suivantes :

  1. POST /users/login-bad :

    • Récupère le mot de passe, le hache en MD5.
    • Compare le hash obtenu avec un hash "stocké" (ex: e10adc3949ba59abbe56e057f20f883e).
    • Problème : C'est une simple comparaison de chaînes de caractères.
  2. POST /users/login-good : implémentation à faire !

    • Route async.
    • Récupère le hash "stocké" (celui de l'étape 3) et le mot de passe de la tentative.
    • Utilise await argon2.verify(hashStocke, motDePasseTentative).
    • Cette fonction renvoie true ou false.
sequenceDiagram
    participant c as client
    participant u as route /login-good
    participant a as argon2id

    c->>u: envoie password
    u->>a: "verification du mot de passe"
    a-->>u: "true ou false"
    u-->>c: resultat authentification
Description
No description provided
Readme 55 KiB
Languages
JavaScript 100%