لا تخزّن كلمات المرور أبدًا
جزء من قسم المصادقة والأمان في رحلة 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 دالة الاستدعاء اللاحق الخاصة بـ scrypt إلى وعد يمكنك استخدام await معه.
التحدي
سهل- في
passwords.js، اجعلhashPassword(password)يُرجعsalt:hash: 16 بايتًا عشوائيًا من الملح ومفتاح scrypt بطول 64 بايتًا، وكلاهما بالصيغة الست عشرية. - يعرض
GET /debug/users/:usernameما خزّنه التسجيل.
اضغط على تشغيل. أرسل POST /signup مع {"username": "ada", "password": "correct horse"}، ثم أرسل كلمة المرور نفسها للمستخدم bob، ثم قارن بين المستخدمين.
جرّب بنفسك
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
// يحوّل كلمة المرور إلى النص الذي تخزّنه عملية التسجيل.
// في الوقت الحالي، يحتفظ بكلمة المرور كما أُدخلت.
export async function hashPassword(password) {
return password;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.