Menu
CoddyTech

Parolaları Asla Saklamayın

Coddy'nin Node.js Journey'sinin Kimlik Doğrulama ve Güvenlik bölümünün bir parçası. Ders 4 / 24.

İnsanlar parolalarını tekrar kullanır; bu nedenle sızdırılan bir düz metin parola, başka yerlerdeki hesapları da açığa çıkarabilir. Tuz eklenmiş bir parola özeti saklayın: bu, kodunu çözmek yerine yeniden hesaplayarak doğruladığınız türetilmiş bir değerdir.

const salt = randomBytes(16).toString('hex');
const key = await scryptAsync(inviteCode, salt, 32);
const saved = salt + '.' + key.toString('hex');

Bu örnek, bir davet kodu için tuz ile türetilmiş anahtarı birleştirir. Ayırıcı, doğrulama sırasında tuzun elde edilmesini ve aynı parametrelerle başka bir anahtar türetilmesini sağlar. Parola görevinizde kendi ayırıcınız ve anahtar uzunluğunuz kullanılır. Her yeni parola için tuzu oluşturun, anahtarı türetin ve ardından ikisini de saklayın. Tuz eklenmiş özetler de güçlü parolalar gerektirir, çünkü saldırganlar tahminleri deneyebilir.

challenge icon

Görev

Kolay

Şu anda kayıt işlemi her parolayı yazıldığı hâliyle kaydediyor. Bunun yerine tuz eklenmiş bir karma kaydetmesini sağlayın; böylece veritabanı sızdırılırsa parolalar açığa çıkmaz.

  1. passwords.js dosyasında, hashPassword(password) işlevini kayıt işleminin kaydettiği metni tuz, iki nokta ve karma biçiminde döndürecek şekilde değiştirin:
    • Tuz, her çağrıda yeni oluşturulan 16 rastgele bayttır ve onaltılık biçimde yazılır: 0 ile 9 ve a ile f arasındaki karakterlerden oluşan 32 karakter.
    • Karma, scrypt işlevinin parola ve bu tuzdan oluşturduğu 64 baytlık bir anahtardır; bu da onaltılık biçimde yazılır: 128 karakter. scryptAsync işlevinin üçüncü argümanı, anahtar uzunluğunu bayt cinsinden belirtir.
    • İkisini iki nokta ile birleştirin. Kaydedilen bir değer şöyle görünür: f2bba0669d9fa2d203afc7e61bf8f065:c3f7cae352e023a8d4766da9a316b5a2c844100efff22c4079f89a8ab8512ac91c33227481c3afa88c3ba0e88347f9e3e0c22dad9d55f19688a350f71be8dbd2
  2. server.js dosyasını değiştirmeniz gerekmez. Dosyadaki POST /signup, zaten hashPassword işlevini çağırıyor ve bu işlevin döndürdüğü değeri kaydediyor. Ayrıca, bir kullanıcı için kaydedilenleri gösteren GET /debug/users/:username uç noktası da var. Bu uç nokta yalnızca inceleyebilmeniz için bulunuyor; gerçek bir uygulamada asla yer almaz.

Deneyin: Çalıştır'a basın. {"username": "ada", "password": "correct horse"} ile POST /signup isteği gönderin. Durum kodu 201 ve {"username": "ada"} yanıtını alırsınız. Aynı gövdeyi bu kez "username": "bob" ile gönderin. Şimdi önce GET /debug/users/ada, ardından GET /debug/users/bob isteği gönderin. Her passwordHash değeri 32 karakter, ardından iki nokta ve 128 karakter daha içerir. Ada ve Bob aynı parolayı seçmiş olsa da iki değer birbirinden farklıdır.

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.
// Şimdilik parolayı yazıldığı hâliyle saklar.
export async function hashPassword(password) {
    return password;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Kimlik Doğrulama ve Güvenlik bölümündeki tüm dersler

Kendi başına pratik yap: Express playground