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.
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.

