Hacher les mots de passe

Voir la vidéo
Description Sommaire

Dans ce tutoriel nous allons découvrir comment sécuriser les mots de passe de nos utilisateurs dans le cadre d'une application.

Le problème

Pour gérer un système d'authentification sur une application web il est nécessaire d'avoir une combinaison nom d'utilisateur / mot de passe et on pourrait être tenté de sauvegarder le mot de passe en clair.

const user = sql('SELECT * FROM user WHERE email = ?', [email])
if (user.password === inputPassword) {
    // Authentification
}

Le souci est que si votre base de données se retrouve compromise, les mots de passe seront testés sur d'autres services et si l'utilisateur utilise le même mot de passe partout cela peut devenir problématique. Il est d'ailleurs possible de tester si son email est compromis sur le site HaveIBeenPwned.

Hacher pour sécuriser

Pour éviter ce problème la solution est de sauvegarder en base de données le "hash" correspondant au mot de passe de l'utilisateur. Ensuite, lorsque l'utilisateur se connectera il suffira de vérifier si l'empreinte du mot de passe entrée à la connexion correspond à celui entré lors de l'inscription.

Dans le cadre de PHP, une fonction utilitaire comme password_hash existe :

// On sauvegardera la hash dans la base de données
$hash = password_hash($inputPassword, PASSWORD_DEFAULT);

// Lors de la connexion on pourra vérifier le mot de passe
$isPasswordValid = password_verify($inputPassword, $hash);

Sur NodeJS il faudra utiliser une librairie spécifique :

const argon2 = require('@phc/argon2');

// Hash à sauvegarder en base de données
const hash = await argon2.hash(inputPassword);

// Pour vérifier le mot de passe
const isPasswordValid = await argon2.verify(hash, inputPassword);

Format PHC

Pour hacher les mots de passe les algorithmes peuvent être amener à changer. Il faut donc un moyen de connaitre l'algorithme utilisé et les paramètres associées. Pour cela il est possible d'utiliser le format PHC. Par exemple :

  • Mot de passe: hunter2
  • Clef de salage: \x81\x98\x95\xFC\xCD`=\xCD\xB6\x12P\a\xFC\x98u\x1F
  • Secret: pepper
  • Variant: argon2id
  • Version: 19
  • Coût temporel: 2
  • Coût mémoire: 65536
  • Parallelism cost: 1

Argon2 génèrera l'empreinte suivante :

$argon2id$v=19$m=65536,t=2,p=1$gZiV/M1gPc22ElAH/Jh1Hw$CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno

Cette empreinte contient les informations qui ont permis de générer le hash (sauf le secret).

Mettre à jour les empreintes

Le format PHC est très intéressant lorsqu'il s'agit de faire évoluer les hash des mots de passe dans notre base de données. Vu qu'on ne peut pas récupérer les mots de passes depuis les hash il va falloir mettre à jour les informations lorsque l'utilisateur rentre son mot de passe à nouveau :

  • L'utilisateur entre son mot de passe
  • On trouve l'utilisateur en base de données
  • On vérifie le hash en utilisant l'algorithme compris dans le format PHC
  • On vérifie que l'algorithme est le plus récent, si ce n'est pas le cas on génère un nouveau hash qui viendra remplacer le précédent.

Dans ces cas plus urgents, il est aussi possible de demander aux utilisateurs de changer leur mot de passe pour générer une nouvelle empreinte.

Publié
Technologies utilisées
Auteur :
Grafikart
Partager