Parola Kontrolü
Coddy'nin Node.js Journey'sinin Kimlik Doğrulama ve Güvenlik bölümünün bir parçası. Ders 2 / 17.
Bir karma geri döndürülemez, bu yüzden oturum açarken saklanan parola hiçbir zaman geri okunmaz. Girişimi aynı şekilde karma hâline getirip iki anahtarı karşılaştırırsın. Aynı şekilde demek, aynı tuzu kullanmak demektir: saklanan salt:hash değerini ayır ve tuzunu yeniden kullan.
=== yerine timingSafeEqual ile karşılaştır. ===, farklı olan ilk baytta durur; bu nedenle çok sayıda yanıtın süresini ölçen bir saldırgan, tahmininin ne kadarının doğru olduğunu öğrenir. timingSafeEqual her zaman aynı süreyi alır. Uzunlukları aynı olan iki Buffer'ı karşılaştırır ve uzunluklar farklıysa hata verir.
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'), onaltılık metni yeniden baytlara dönüştürür.
Görev
Kolaypasswords.jsdosyasındaverifyPassword(password, stored)işlevini ekleyip dışa aktar: parola, saklanan değeri oluşturduğunda doğru sonuç verir.server.jsdosyasında{ username, password }ilePOST /loginuç noktasını ekle: doğru girişte 200{ username }, yanlış parola veya bilinmeyen kullanıcı adı için 401{ "error": "Wrong username or password" }.
ada ile kaydol, oturum aç, ardından yanlış bir parolayla oturum aç.
Kendin dene
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
// Bir parolayı signup'ın sakladığı metne dönüştürür.
export async function hashPassword(password) {
const salt = randomBytes(16).toString('hex');
const key = await scryptAsync(password, salt, 64);
return `${salt}:${key.toString('hex')}`;
}