المستوى المطلوب: متوسط — محتاج معرفة أساسية بـ Node.js وسطر الأوامر، وقاعدة بيانات بسيطة تخزّن سرًّا واحدًا لكل مستخدم. مش محتاج أي خبرة تشفير مسبقة.
اعمل مصادقة ثنائية (2FA) بأكواد TOTP في Node.js من الصفر
في أقل من 20 دقيقة هتبني تحقق بخطوتين حقيقي بأكواد TOTP — نفس الأكواد اللي بيولّدها Google Authenticator وMicrosoft Authenticator — من غير أي خدمة خارجية ولا رسائل SMS. النتيجة: حتى لو اتسربت كلمة سر المستخدم، المهاجم مش هيدخل من غير الكود اللي على تليفون صاحب الحساب.
المشكلة باختصار
كلمة السر لوحدها بتفشل في هجوم واحد شائع: credential stuffing. المهاجم بياخد قوائم كلمات سر مسرّبة من مواقع تانية ويجرّبها عندك آليًا. لو عندك موقع بيتعرّض لـ 200 ألف محاولة دخول بكلمات سر صحيحة مسروقة، الباسورد لوحده مش هيوقفهم. الطبقة التانية (حاجة معاك، مش حاجة بتعرفها) هي اللي بتكسر الهجوم ده.
الرقم اللي بيهمك: مايكروسوفت نشرت إن تفعيل المصادقة متعددة العوامل بيوقف أكثر من 99.2% من هجمات اختراق الحسابات الآلية. ده مش تحسين تجميلي، ده فرق بين حساب مخترق وحساب آمن.
إزاي بيشتغل الكود المؤقت TOTP؟
تخيّل إنك وصاحبك اتفقتوا على رقم سري، وكمان الاتنين معاكم نفس الساعة بالظبط. كل نص دقيقة بتخلطوا الرقم السري مع الوقت الحالي وتطلّعوا رقم من 6 خانات. مفيش حد بيكلّم التاني، ومع ذلك الاتنين بيوصلوا لنفس الرقم في نفس اللحظة. لو جه غريب معهوش الرقم السري، مش هيقدر يخمّن الرقم اللي هيظهر.
ده بالظبط اللي بيحصل في TOTP، بس بدقة رياضية. الطرفان (السيرفر والتطبيق على التليفون) بيتشاركوا سرًّا واحدًا وقت التسجيل. عند كل تحقق، كل طرف بيحسب عدّاد زمني: counter = floor(unixTime / 30). بعدين بيمرّر السر والعدّاد على دالة HMAC-SHA1، وياخد 4 بايتات منها (خطوة اسمها dynamic truncation)، ويحوّلها لرقم من 6 خانات. الاتنين بيطلعوا نفس الكود من غير أي اتصال شبكي بينهم. ده المعرّف في RFC 6238، وهو مبني على HOTP في RFC 4226.
الخطوات العملية
- ولّد سرًّا عشوائيًا لكل مستخدم وخزّنه في قاعدة البيانات بترميز Base32 (ده اللي بتفهمه تطبيقات الـ authenticator).
- ابنِ رابط
otpauth://واعرضه كـ QR code علشان المستخدم يمسحه. - اطلب من المستخدم أول كود وتحقّق منه قبل ما تفعّل الميزة — ده بيثبت إن التليفون والسيرفر متزامنين.
- عند كل تسجيل دخول، بعد الباسورد، اطلب الكود وتحقّق منه بنافذة تسامح صغيرة للفروق الزمنية.
- ولّد أكواد احتياطية (backup codes) علشان المستخدم اللي يضيّع تليفونه.
الخطوة الأولى والتانية — توليد السر ورابط الـ QR: