Menu
CoddyTech

Nigdy nie przechowuj haseł

Część sekcji Uwierzytelnianie i bezpieczeństwo ścieżki Node.js w Coddy. Lekcja 1 z 17.

Jeśli baza danych wycieknie, każde zapisane w niej hasło w postaci wpisanej przez użytkownika będzie można odczytać, a ludzie używają tego samego hasła w innych serwisach. Dlatego zamiast tego przechowujesz hash: wartość obliczoną na podstawie hasła, której nie da się przekształcić z powrotem w to hasło.

Do obsługi haseł Node udostępnia crypto.scrypt. Jest celowo powolna, więc odgadnięcie milionów haseł zajęłoby atakującemu wiele godzin. Salt, czyli losowe bajty dodawane przed haszowaniem, sprawia, że dwie osoby używające tego samego hasła otrzymają różne hashe. Salt nie jest tajny: przechowujesz go obok hasha.

import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';

const scryptAsync = promisify(scrypt);

const salt = randomBytes(16).toString('hex');
const key = await scryptAsync('pin 4821', salt, 32);
console.log(key.toString('base64'));

promisify przekształca funkcję zwrotną scrypt w promise, którego możesz użyć z await.

challenge icon

Wyzwanie

Łatwy
  • W pliku passwords.js spraw, aby hashPassword(password) zwracała salt:hash: 16 losowych bajtów soli i 64-bajtowy klucz scrypt, oba zapisane w systemie szesnastkowym.
  • GET /debug/users/:username pokazuje, co zapisano podczas rejestracji.

Naciśnij Uruchom. Wyślij POST /signup z {"username": "ada", "password": "correct horse"}, następnie użyj tego samego hasła dla bob i porównaj obu użytkowników.

Spróbuj swoich sił

import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';

const scryptAsync = promisify(scrypt);

// Przekształca hasło w tekst przechowywany podczas rejestracji.
// Na razie zachowuje hasło w postaci, w jakiej zostało wpisane.
export async function hashPassword(password) {
    return password;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uwierzytelnianie i bezpieczeństwo