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.
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.
passwords.jsdosyası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,
scryptiş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.scryptAsynciş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
server.jsdosyasını değiştirmeniz gerekmez. DosyadakiPOST /signup, zatenhashPasswordişlevini çağırıyor ve bu işlevin döndürdüğü değeri kaydediyor. Ayrıca, bir kullanıcı için kaydedilenleri gösterenGET /debug/users/:usernameuç 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;
}
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
1Şifreler
Baytlar ve Onaltılık MetinParola Anahtarı TüretmeYeni Bir TuzParolaları Asla SaklamayınAnahtar Baytlarını KarşılaştırmaParolayı DoğrulamaKayıt KurallarıKendi başına pratik yap: Express playground