–
Mission 1Auth & sécurité

Hacher, pas chiffrer

Monde 1 · Les mots de passe

Codey

Concept

Une base de données finit toujours par fuiter

Une application ne doit jamais connaître le mot de passe de ses utilisateurs. Elle stocke une empreinte : le résultat d'une fonction de hachage, facile à calculer dans un sens et impossible à inverser.

Hacher n'est pas chiffrer : un chiffrement se déchiffre avec une clé, un hachage ne se « déhache » pas. À la connexion, on hache la saisie et on compare les empreintes.

Deux précautions indispensables. Le sel : une valeur aléatoire propre à chaque compte, mélangée au mot de passe, pour que deux mots de passe identiques donnent deux empreintes différentes. La lenteur : une fonction faite pour les mots de passe (PBKDF2, bcrypt, Argon2) répète le calcul des centaines de milliers de fois, pour qu'un attaquant ne puisse pas en tester des milliards par seconde.

Exemple
1const enc = new TextEncoder();2 3async function hacher(motDePasse, sel) {4  const cle = await crypto.subtle.importKey("raw", enc.encode(motDePasse), "PBKDF2", false, ["deriveBits"]);5  const bits = await crypto.subtle.deriveBits(6    { name: "PBKDF2", salt: enc.encode(sel), iterations: 100000, hash: "SHA-256" },7    cle,8    256,9  );10  return [...new Uint8Array(bits)].map((b) => b.toString(16).padStart(2, "0")).join("");11}

SHA-256 seul est trop rapide pour des mots de passe : une carte graphique en teste des milliards par seconde. PBKDF2 avec 100 000 itérations fait le même travail 100 000 fois plus lentement — pour l'attaquant.