Jangan Simpan Kata Sandi
Termasuk bagian Autentikasi dan Keamanan dalam perjalanan Node.js di Coddy. Pelajaran 4 dari 24.
Orang menggunakan kembali kata sandi, sehingga kata sandi teks biasa yang bocor dapat membahayakan akun di tempat lain. Simpan hash kata sandi yang diberi salt: nilai turunan yang kamu verifikasi dengan menghitungnya ulang, bukan dengan mendekodenya.
const salt = randomBytes(16).toString('hex');
const key = await scryptAsync(inviteCode, salt, 32);
const saved = salt + '.' + key.toString('hex');Contoh ini menggabungkan salt dan kunci turunan untuk kode undangan. Pembatas memungkinkan proses verifikasi mendapatkan kembali salt dan menghasilkan kunci lain dengan parameter yang sama. Tugas kata sandimu menggunakan pembatas dan panjang kunci tersendiri. Buat salt untuk setiap kata sandi baru, hasilkan kuncinya, lalu simpan keduanya. Hash dengan salt tetap memerlukan kata sandi yang kuat karena penyerang dapat mencoba berbagai tebakan.
Tantangan
MudahSaat ini, pendaftaran menyimpan setiap kata sandi persis seperti yang diketik. Buat agar pendaftaran menyimpan hash bersalt, sehingga kebocoran database tidak membocorkan kata sandinya.
- Di
passwords.js, ubahhashPassword(password)agar mengembalikan teks yang disimpan oleh pendaftaran, dalam format salt, titik dua, hash:- Salt adalah 16 byte acak, dibuat baru pada setiap pemanggilan dan ditulis sebagai hex: 32 karakter dari 0 sampai 9 dan a sampai f.
- Hash adalah kunci 64 byte yang dibuat
scryptdari kata sandi dan salt tersebut, juga ditulis sebagai hex: 128 karakter. Argumen ketigascryptAsyncadalah panjang kunci dalam byte. - Gabungkan keduanya dengan titik dua. Nilai yang tersimpan akan terlihat seperti ini:
f2bba0669d9fa2d203afc7e61bf8f065:c3f7cae352e023a8d4766da9a316b5a2c844100efff22c4079f89a8ab8512ac91c33227481c3afa88c3ba0e88347f9e3e0c22dad9d55f19688a350f71be8dbd2
- Kamu tidak perlu mengubah
server.js.POST /signupdi dalamnya sudah memanggilhashPassworddan menyimpan nilai yang dikembalikannya. File itu juga memilikiGET /debug/users/:username, yang menampilkan nilai yang disimpan untuk satu pengguna. Rute itu hanya ada agar kamu bisa melihatnya, aplikasi sungguhan tidak pernah memilikinya.
Coba: Tekan Jalankan. Kirim POST /signup dengan {"username": "ada", "password": "correct horse"}. Kamu akan mendapat status 201 dan {"username": "ada"}. Kirim body yang sama dengan "username": "bob". Sekarang kirim GET /debug/users/ada, lalu GET /debug/users/bob. Setiap passwordHash terdiri dari 32 karakter, titik dua, lalu 128 karakter lagi. Kedua nilainya berbeda, meskipun ada dan bob memilih kata sandi yang sama.
Coba sendiri
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
// Mengubah kata sandi menjadi teks yang disimpan oleh signup.
// Untuk saat ini, kata sandi tetap seperti yang diketik.
export async function hashPassword(password) {
return password;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Autentikasi dan Keamanan
1Kata Sandi
Byte dan Teks HeksadesimalMembuat Kunci Kata SandiSalt BaruJangan Simpan Kata SandiMembandingkan Byte KunciMemeriksa Kata SandiAturan PendaftaranLatihan sendiri: Playground Express