First commit
This commit is contained in:
115
README.md
Normal file
115
README.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user