Menu
CoddyTech

לעולם אל תשמרו סיסמאות

חלק מהיחידה אימות ואבטחה במסלול ה-Node.js של Coddy. שיעור 1 מתוך 17.

אם מסד הנתונים שלך דולף, אפשר לקרוא כל סיסמה שנשמרה כפי שהוקלדה, ואנשים משתמשים באותה סיסמה באתרים אחרים. לכן שומרים במקום זאת ערך גיבוב: ערך שמחושב מהסיסמה ושאי אפשר להפוך בחזרה לסיסמה.

לסיסמאות, Node מציעה את crypto.scrypt. היא איטית בכוונה, כדי שניחוש של מיליוני סיסמאות יעלה לתוקף שעות. מלח, כלומר בתים אקראיים שמערבבים לפני הגיבוב, גורם לכך ששני אנשים עם אותה סיסמה יקבלו ערכי גיבוב שונים. המלח אינו סודי: שומרים אותו לצד ערך הגיבוב.

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 הופכת את callback של scrypt ל-promise שאפשר להשתמש בו עם await.

challenge icon

אתגר

קל
  • בקובץ passwords.js, יש לגרום ל-hashPassword(password) להחזיר salt:hash: מלח של 16 בתים אקראיים ומפתח scrypt באורך 64 בתים, שניהם בהקסדצימלי.
  • GET /debug/users/:username מציג את מה שההרשמה שמרה.

לחצו על Run. שלחו POST /signup עם {"username": "ada", "password": "correct horse"}, ואז את אותה סיסמה עבור bob, ואז השוו בין שני המשתמשים.

נסו בעצמכם

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

const scryptAsync = promisify(scrypt);

// ממיר סיסמה לטקסט ש-signup שומר.
// לעת עתה הוא שומר את הסיסמה כפי שהוקלדה.
export async function hashPassword(password) {
    return password;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה אימות ואבטחה