Memeriksa Kata Sandi
Termasuk bagian Autentikasi dan Keamanan dalam perjalanan Node.js di Coddy. Pelajaran 2 dari 17.
Hash tidak bisa dibalik, jadi proses login tidak pernah membaca kembali kata sandi yang disimpan. Hash percobaan dengan cara yang sama, lalu bandingkan kedua kunci tersebut. Cara yang sama berarti salt yang sama: pisahkan salt:hash yang disimpan, lalu gunakan kembali salt-nya.
Bandingkan dengan timingSafeEqual, bukan ===. === berhenti pada byte pertama yang berbeda, sehingga penyerang yang mengukur waktu banyak jawaban dapat mengetahui seberapa banyak tebakan yang benar. timingSafeEqual selalu membutuhkan waktu yang sama. Fungsi ini membandingkan dua Buffer dengan panjang yang sama dan menghasilkan error jika panjangnya berbeda.
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') mengubah teks hex kembali menjadi byte.
Tantangan
Mudah- Di
passwords.js, tambahkan dan eksporverifyPassword(password, stored): benar jika kata sandi tersebut menghasilkan nilai tersimpan itu. - Di
server.js, tambahkanPOST /logindengan{ username, password }: 200{ username }, atau 401{ "error": "Wrong username or password" }untuk kata sandi yang salah atau nama yang tidak dikenal.
Daftar dengan ada, login, lalu login dengan kata sandi yang salah.
Coba sendiri
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
// Mengubah kata sandi menjadi teks yang disimpan saat pendaftaran.
export async function hashPassword(password) {
const salt = randomBytes(16).toString('hex');
const key = await scryptAsync(password, salt, 64);
return `${salt}:${key.toString('hex')}`;
}
Semua pelajaran di Autentikasi dan Keamanan
4Pemilik dan Keamanan
Hanya CatatanmuPeran AdminLatihan sendiri: Playground Express