Ne jamais stocker de mots de passe
Fait partie de la section Authentification et sécurité du Journey Node.js de Coddy. Leçon 1 sur 17.
Si votre base de données fuit, chaque mot de passe stocké en clair peut être lu, et les gens utilisent le même mot de passe sur d’autres sites. Vous stockez donc plutôt un hachage : une valeur calculée à partir du mot de passe, qui ne peut pas être reconvertie en celui-ci.
Pour les mots de passe, Node propose crypto.scrypt. Cette fonction est volontairement lente, afin que deviner des millions de mots de passe prenne des heures à un attaquant. Un sel, des octets aléatoires ajoutés avant le hachage, fait en sorte que deux personnes ayant le même mot de passe obtiennent des hachages différents. Le sel n’est pas secret : vous le stockez à côté du hachage.
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
const salt = randomBytes(16).toString('hex');
const key = await scryptAsync('pin 4821', salt, 32);
console.log(key.toString('base64'));promisify transforme le rappel de scrypt en une promesse que vous pouvez await.
Défi
Facile- Dans
passwords.js, faites en sorte quehashPassword(password)renvoiesalt:hash: 16 octets aléatoires de sel et une clé scrypt de 64 octets, les deux en hexadécimal. GET /debug/users/:usernameaffiche ce que l’inscription a enregistré.
Appuyez sur Exécuter. Envoyez POST /signup avec {"username": "ada", "password": "correct horse"}, puis envoyez le même mot de passe pour bob, puis comparez les deux utilisateurs.
Essayez vous-même
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
// Transforme un mot de passe en texte stocké par signup.
// Pour l’instant, le mot de passe est conservé tel qu’il a été saisi.
export async function hashPassword(password) {
return password;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.