Auth

Développer une authentification sécurisée

revoir l’épisode précédent

La vie en clair

Lorsque vous interagissez avec une application, celle-ci stocke souvent vos informations dans une base de données. Parmi ces informations, les mots de passe jouent un rôle crucial pour sécuriser l’accès aux comptes utilisateur.

Jetez un coup d’œil à la table utilisateur (user) ci-dessous, où les informations sont stockées de manière lisible :

select * from user;

Vous devriez obtenir un tableau semblable à celui-ci :

id email password is_admin
1 jdoe@mail.com 12345678 0

Ces informations comprennent l’identifiant (id), l’adresse e-mail (email), le mot de passe (password), et une indication du statut administrateur (is_admin). Cependant, stocker les mots de passe de cette manière n’est pas sûr.

Changez de branche dans votre projet avec la commande Git :

git switch hash-password

Relancez le projet en effectuant les migrations de base de données :

npm install
npm run db:migrate
npm run dev

Relancer la migration (npm run db:migrate) supprimera tous les utilisateurs précédemment créés, car nous effectuons une mise à jour dans la manière dont les mots de passe sont stockés.

Après ces étapes, créez un nouvel utilisateur depuis la page http://localhost:3000/register (adaptez le port au besoin).

Explorez à nouveau le contenu de la table user. Vous remarquerez que le mot de passe n’est plus stocké en texte brut, mais plutôt sous la forme d’un haché généré par Argon2. La nouvelle configuration ressemble à ceci :

id email hashed_password is_admin
1 jdoe@mail.com $argon2id$v=19$m=19456,t=2,p=1$nz6t40CzCcijUhj3Ntpz9A$4DW+9sqLdKvj27E3JYbImIIfZAadyDGXHFiwpBHli4s 0

Cette transformation offre une sécurité renforcée en empêchant la récupération facile des mots de passe originaux, même en cas d’accès non autorisé à la base de données. Dans la prochaine section, nous explorerons plus en détail la structure des hachés de mots de passe générés avec Argon2.

Hacher les mots de passe

Dans la nouvelle configuration, vous avez probablement remarqué le changement dans la manière dont les mots de passe sont stockés dans la base de données. Auparavant, ils étaient stockés en texte brut, mais maintenant, ils sont hachés à l’aide de l’algorithme Argon2.

Qu’est-ce que le hachage de mot de passe ?

Le hachage de mot de passe est une technique de sécurité essentielle pour protéger les informations sensibles, telles que les mots de passe, stockées dans une base de données. Plutôt que de stocker les mots de passe en texte brut, on utilise des fonctions de hachage pour les transformer en chaînes de caractères apparemment aléatoires, appelées hachés.

Contrairement à l’encodage ou au cryptage, le hachage est une opération à sens unique :

Opération Opération inverse
encoder décoder
crypter décrypter
hacher déhacher

Avantages du hachage de mot de passe :

Structure d’un mot de passe haché avec Argon2

Un mot de passe haché avec Argon2 est structuré comme suit :

$argon2id$v=19$m=19456,t=2,p=1$nz6t40CzCcijUhj3Ntpz9A$4DW+9sqLdKvj27E3JYbImIIfZAadyDGXHFiwpBHli4s

Il est important de noter que comprendre tous les détails de cette structure n’est pas nécessaire pour les utilisateurs réguliers. Cependant, la présence de ces informations dans le haché permet de générer un haché avec la même configuration. Cette propriété est cruciale lors de la vérification des mots de passe pendant le processus d’authentification.

Lorsque vous vous connectez avec votre mot de passe, le système utilise ces détails pour recréer le même haché et le compare à celui stocké en base de données. Si les hachés correspondent, cela signifie que le mot de passe fourni est correct, tout en évitant de stocker le mot de passe réel. C’est une pratique essentielle pour assurer la sécurité des mots de passe des utilisateurs.

Comment ça se code ?

Si vous souhaitez explorer les détails du code lié à la gestion des mots de passe hachés dans cette branche, voici un aperçu des modifications apportées dans le diff GitHub.

Modifications sur la création d’utilisateurs

const hashPassword = async (req, res, next) => {
  try {
    const { password } = req.body;
    const hashedPassword = await argon2.hash(password, hashingOptions);

    req.body.hashedPassword = hashedPassword;
    delete req.body.password;

    next();
  } catch (err) {
    next(err);
  }
};
router.post("/users", hashPassword, userActions.add);

Modifications sur la connexion

const verified = await argon2.verify(user.hashed_password, req.body.password);
if (verified) {
  // Respond with the user in JSON format (but without the hashed password)
  delete user.hashed_password;

  res.json(user);
} else {
  res.sendStatus(422);
}

En explorant le diff GitHub, vous pourrez voir plus en détail les lignes de code modifiées dans les fichiers concernés. Cela vous permettra de comprendre comment la gestion des mots de passe a été implémentée dans cette branche du projet.

Next

Ces modifications apportent une couche supplémentaire de sécurité en adoptant le hachage de mots de passe avec l’algorithme Argon2.

Cependant, la sécurité ne s’arrête pas là. Dans la prochaine étape passionnante, nous explorerons la sécurisation du processus de connexion en utilisant JSON Web Tokens (JWT).

GO 🚀