3.8 KiB
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)
- Démarrez votre serveur Express :
nodemon ./bin/www - Avec un outil comme Postman, faites un appel
POSTsurhttp://localhost:3000/users/register-badavec le JSON suivant :{ "username": "testeur", "password": "123456" } - Notez le hash renvoyé. (Il devrait être
e10adc3949ba59abbe56e057f20f883e. Vous pouvez le confirmer également via ce site : https://www.md5hashgenerator.com/). - Allez sur le site crackstation.net.
- 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.
- Installez la bibliothèque recommandée :
npm install argon2 - Dans
routes/users.js, importezargon2:const argon2 = require('argon2'); - Complétez la route
POST /users/register-good:- Cette route doit être
async. - Récupérez
usernameetpassworddepuisreq.body. - Utilisez
await argon2.hash(...)pour hacher le mot de passe. - Utilisez un bloc
try...catchpour gérer les erreurs de hachage. - Renvoie le nouveau hachage sécurisé.
- Cette route doit être
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 :
-
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.
-
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
trueoufalse.
- Route
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