Vérifier un mot de passe
Fait partie de la section Authentification et sécurité du Journey Node.js de Coddy. Leçon 2 sur 17.
Un hachage ne peut pas être inversé, donc une connexion ne relit jamais le mot de passe stocké. Tu haches la tentative de la même manière et compares les deux clés. De la même manière signifie avec le même sel : sépare le salt:hash stocké et réutilise son sel.
Compare avec timingSafeEqual, pas avec ===. === s’arrête au premier octet différent, donc un attaquant qui chronomètre de nombreuses réponses apprend quelle partie de sa supposition était correcte. timingSafeEqual prend toujours le même temps. Elle compare deux Buffer de même longueur et lève une exception si leurs longueurs diffèrent.
import { timingSafeEqual } from 'node:crypto';
const expected = Buffer.from(process.env.API_KEY);
const given = Buffer.from(req.get('x-api-key') ?? '');
const ok = given.length === expected.length && timingSafeEqual(given, expected);Buffer.from(hex, 'hex') reconvertit le texte hexadécimal en octets.
Défi
Facile- Dans
passwords.js, ajoute et exporteverifyPassword(password, stored): vrai lorsque le mot de passe a produit cette valeur stockée. - Dans
server.js, ajoutePOST /loginavec{ username, password }: 200{ username }, ou 401{ "error": "Wrong username or password" }en cas de mot de passe incorrect ou de nom inconnu.
Inscris-toi avec ada, connecte-toi, puis connecte-toi avec un mot de passe incorrect.
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.
export async function hashPassword(password) {
const salt = randomBytes(16).toString('hex');
const key = await scryptAsync(password, salt, 64);
return `${salt}:${key.toString('hex')}`;
}