First commit

This commit is contained in:
Johan
2025-12-18 15:23:38 +01:00
commit 965ed9aaba
7 changed files with 2307 additions and 0 deletions

115
README.md Normal file
View File

@@ -0,0 +1,115 @@
# 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 :
```mermaid
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 :
```javascript
// 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 :
```bash
nodemon ./bin/www
```
1. Avec un outil comme Postman, faites un appel `POST` sur `http://localhost:3000/users/register-bad` avec le JSON suivant :
```json
{
"username": "testeur",
"password": "123456"
}
```
2. **Notez le hash renvoyé.** (Il devrait être `e10adc3949ba59abbe56e057f20f883e`. Vous pouvez le confirmer également via ce site : https://www.md5hashgenerator.com/).
3. Allez sur le site [crackstation.net](https://crackstation.net/).
4. 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 :
```bash
npm install argon2
```
2. Dans `routes/users.js`, importez `argon2` :
```javascript
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é.
```mermaid
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`.
```mermaid
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
```