FlowingDev

شرح TOTP: كيف يعرف هاتفك المصافحة السرية

تعلم كيف تنشئ كلمات المرور لمرة واحدة المعتمدة على الوقت (TOTP) طبقة ثانية آمنة من المصادقة باستخدام سر مشترك والوقت الحالي.

جرّب الأداة: مولّد TOTP / 2FA

في جملة واحدة

TOTP هي خوارزمية تولّد رمزًا رقميًا مؤقتًا ومتغيرًا باستمرار من سر مشترك والوقت الحالي، ويُستخدم كعامل ثانٍ لتسجيل الدخول.

المشكلة التي يحلها

خلونا صريحين: كلمات المرور شر لا بد منه. ننساها، ونعيد استخدامها، والمهاجمون بارعون بشكل محبط في سرقتها من خلال التصيد الاحتيالي (phishing)، واختراق قواعد البيانات، والتخمين التقليدي. الاعتماد على كلمة مرور وحدها يشبه قفل باب منزلك الأمامي ووضع المفتاح تحت ممسحة الباب.

وهنا يأتي دور المصادقة متعددة العوامل (MFA)، وأشهر أنواعها، المصادقة الثنائية (2FA). الفكرة هي إثبات هويتك بأكثر من مجرد شيء تعرفه (كلمة مرور). تحتاج أيضًا إلى شيء تملكه (مثل هاتفك) أو شيء أنت عليه (مثل بصمة إصبعك).

في البداية، كانت المصادقة الثنائية (2FA) تعني غالبًا الحصول على رمز عبر رسائل SMS. كان هذا أفضل من لا شيء، ولكنه عرضة لهجمات "تبديل شريحة SIM"، حيث يقنع المحتال شركة الاتصالات الخاصة بك بنقل رقمك إلى هاتفه. وفجأة، يبدأ هو في تلقي رموز المصادقة الثنائية الخاصة بك. ليس بالأمر الجيد.

وهنا ظهرت تطبيقات المصادقة. بدلاً من الاعتماد على أمان شبكة الهاتف المهتز، يمكن لتطبيق على جهازك إنشاء رموز محليًا. ولكن كيف يعرف تطبيق Google Authenticator الخاص بك كيفية إنشاء رمز لحسابك على GitHub؟ وكيف يعرف Microsoft Authenticator كيف يتحدث مع حسابك في Dropbox؟

كلهم يتحدثون نفس اللغة القياسية المفتوحة: TOTP، وهي كلمة المرور لمرة واحدة المعتمدة على الوقت. TOTP هو البطل المجهول الذي يفصل عاملك الثاني عن أي شركة واحدة. إنه معيار مفتوح وقابل للتشغيل البيني يسمح لأي تطبيق متوافق بالعمل مع أي خدمة متوافقة. إنه تطور لمعيار سابق يسمى HOTP (الذي كان يعتمد على عداد بسيط)، ولكن باستخدام الوقت كجزء متحرك، أصبح TOTP أسهل بكثير في الاستخدام.

كيف يعمل من الداخل

يبدو TOTP وكأنه سحر. تقوم بمسح رمز QR مرة واحدة، ولبقية الوقت، يمكن لهاتفك وخادم في منتصف العالم أن يتفقا على نفس الرقم المكون من ستة أرقام كل 30 ثانية، دون أن يتحدثا مع بعضهما البعض مرة أخرى. إنه ليس سحرًا، بل مجرد تشفير ذكي جدًا.

دعونا نحلل الوصفة.

السر المشترك: مفتاح المملكة

كل شيء يبدأ بسر. عند تمكين المصادقة الثنائية (2FA) على خدمة ما، يقوم الخادم بإنشاء مفتاح سري عشوائي (على سبيل المثال، 160 بت من العشوائية البحتة). هذا السر هو الشيء الوحيد الذي تحتاج أنت والخادم إلى معرفته. يعتمد أمان النظام بأكمله على الحفاظ على سريته.

بالطبع، سلسلة من 160 بت عشوائي ليست سهلة الاستخدام. لذا بالنسبة لنا نحن البشر، يتم ترميزها بتنسيق يسمى Base32. على عكس ابن عمه Base64، يستخدم Base32 أبجدية أصغر غير حساسة لحالة الأحرف ويتجنب الأحرف الغامضة مثل 1 و l، أو 0 و O. هذا يجعل من الممكن (وإن كان لا يزال مزعجًا) كتابته يدويًا إذا لم تتمكن من مسح رمز QR.

يبدو السر المشفر بـ Base32 عادةً هكذا: JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP

الطريقة الأكثر شيوعًا لإدخال هذا السر إلى تطبيق المصادقة الخاص بك هي عبر رمز QR الذي يرمز لـ URI خاص:

otpauth://totp/FlowingDev:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=FlowingDev

يقوم تطبيقك بمسح هذا، ويحفظ المُصدر (FlowingDev)، واسم الحساب (user@example.com)، والأهم من ذلك، secret. تمت المصافحة.

الجزء المتحرك: الوقت

حرف "T" في TOTP يرمز إلى Time-Based (معتمد على الوقت). هذا هو المكون الحاسم الذي يجعل الرمز يتغير. لكن النظام لا يستخدم الوقت الدقيق بالمللي ثانية - سيكون من المستحيل مزامنته. بدلاً من ذلك، يستخدم خطوة زمنية متقطعة.

الصيغة بسيطة:

TimeStep = floor(CurrentUnixTime / 30)

  • CurrentUnixTime: عدد الثواني التي مرت منذ 1 يناير 1970 (عصر يونكس أو Unix Epoch).
  • / 30: الخطوة الزمنية عالميًا تقريبًا هي 30 ثانية.

ينتج عن هذه العملية الحسابية عدد صحيح لا يتغير إلا كل 30 ثانية. في الساعة 10:00:00 صباحًا، تكون قيمة TimeStep هي T. في الساعة 10:00:29 صباحًا، لا تزال T. ولكن في الساعة 10:00:30 صباحًا، تزيد لتصبح T+1. هذه الـ TimeStep هي "الرسالة" التي سنقوم بتوثيقها.

السحر التشفيري: HMAC-SHA1

الآن نجمع بين السر الثابت والخطوة الزمنية المتحركة. يتم ذلك باستخدام أداة تشفير أولية تسمى HMAC (Hash-based Message Authentication Code).

HMAC_Result = HMAC-SHA1(SecretKey, TimeStep)

فكر في HMAC كطريقة لإنشاء توقيع آمن. يأخذ مفتاحنا السري والبيانات التي نريد توقيعها (الـ TimeStep) ويخلطها معًا باستخدام دالة هاش (hash) - في هذه الحالة، SHA-1 العريقة.

الناتج هو هاش بحجم 20 بايت (160 بت). إنها سلسلة سداسية عشرية طويلة وفريدة تمامًا لذلك السر المحدد وتلك الخطوة الزمنية المحددة. غير بتًا واحدًا من السر أو انتظر 30 ثانية لتتغير الخطوة الزمنية، وستحصل على هاش مختلف تمامًا.

بينما لـ SHA-1 نقاط ضعف معروفة لأغراض أخرى مثل توقيع الشهادات، إلا أنها لا تزال تعتبر آمنة تمامًا عند استخدامها داخل بنية HMAC. العديد من التطبيقات الحديثة تنتقل إلى HMAC-SHA256 أو HMAC-SHA512 لمزيد من الأمان.

الاقتطاع: الوصول إلى ستة أرقام

سلسلة سداسية عشرية من 20 بايت ليست رمزًا سهل الاستخدام مكون من ستة أرقام. الخطوة الأخيرة هي "اقتطاع ديناميكي" لهذا الهاش إلى رقم يمكننا استخدامه بالفعل.

  1. ابحث عن الإزاحة (Offset): انظر إلى آخر 4 بتات (nibble) من نتيجة HMAC المكونة من 20 بايت. هذا يعطينا رقمًا بين 0 و 15. هذا هو offset الخاص بنا.
  2. احصل على 4 بايت: بدءًا من موضع offset هذا في الهاش المكون من 20 بايت، خذ الـ 4 بايت التالية (32 بت).
  3. امسح البت العلوي: خذ هذه الكتلة المكونة من 32 بت وقم بعملية AND منطقية (bitwise AND) مع 0x7FFFFFFF. هذا يزيل البت الأول بشكل فعال، مما يحل بعض المشاكل المحتملة المتعلقة بالأعداد الصحيحة الموجبة والسالبة ويضمن أن النتيجة دائمًا موجبة.
  4. وقت المودولو! الآن لديك عدد صحيح كبير من 31 بت. لخفضه إلى 6 أرقام، تأخذ باقي قسمته على 1,000,000 (10^6).
  5. املأ بالأصفار: النتيجة هي الرمز الخاص بك! إذا كان الرقم، على سبيل المثال، 4521، فإنك تملأه بأصفار بادئة ليصبح 004521.

هذا كل شيء! يقوم كل من هاتفك والخادم بتشغيل نفس الحساب بالضبط. عندما تدخل الرمز، يقارن الخادم نتيجته بنتيجتك. لمراعاة الانحراف الطفيف في الساعة بين هاتفك والخادم، سيقوم الخادم عادةً بالتحقق من الرمز للخطوة الزمنية الحالية، والسابقة، واللاحقة. إذا تطابق أي منها، فأنت بالداخل.

قصص من الواقع

الاستيلاء على حساب GitHub الذي لم يحدث

مطور، منغمس تمامًا في عمله، يتلقى بريدًا إلكترونيًا يبدو تمامًا وكأنه من GitHub، يحذر من مشكلة أمنية. في لحظة تشتت، ينقر على الرابط، ويهبط على صفحة استنساخ طبق الأصل من صفحة تسجيل دخول GitHub، ويدخل اسم المستخدم وكلمة المرور. المهاجم الآن لديه بيانات اعتماده. يحاول المخترق على الفور تسجيل الدخول إلى GitHub الحقيقي. يدخل كلمة المرور المسروقة... ويواجه مطالبة: "الرجاء إدخال رمز المصادقة الثنائية الخاص بك." المهاجم عالق تمامًا. ليس لديه هاتف المطور وليس لديه أي طريقة لإنشاء رمز TOTP. في هذه الأثناء، يتلقى المطور بريدًا إلكترونيًا حقيقيًا من GitHub حول تسجيل دخول جديد، ويدرك خطأه، ويغير كلمة المرور الخاصة به على الفور.

الدرس: يعمل TOTP كجدار حماية حاسم. إنه يحول اختراق كلمة مرور كارثي محتمل إلى محاولة تسجيل دخول فاشلة وغير ضارة.

حالة طوارئ الوصول دون اتصال بالإنترنت

مهندس شبكات على متن رحلة جوية لحضور مؤتمر. بعد ثلاثين دقيقة من الإقلاع، يحتاج إلى التحقق من نظام إنتاج حرج. لا يوجد واي فاي على متن الطائرة ولا توجد خدمة خلوية. ستكون المصادقة الثنائية المستندة إلى الرسائل القصيرة أو الإشعارات الفورية عديمة الفائدة. لكن لوحة التحكم الخاصة به مؤمنة بـ TOTP. يفتح الكمبيوتر المحمول الخاص به، ويصل إلى صفحة تسجيل الدخول، ويفتح تطبيق المصادقة على هاتفه، ويكتب الرمز المكون من ستة أرقام. لا يحتاج التطبيق إلى أي اتصال بالإنترنت؛ حساباته الرياضية مكتفية ذاتيًا، وتعتمد فقط على السر المشترك والساعة الداخلية للهاتف. يسجل الدخول ويحل المشكلة قبل أن يبدأ مضيفو الطيران في تقديم المشروبات.

الدرس: قدرة TOTP على العمل دون اتصال بالإنترنت تمامًا تجعله قويًا وموثوقًا بشكل لا يصدق للوصول الحرج، بغض النظر عن مكان وجودك.

صداع ترحيل البيانات عبر الأنظمة... تم حله

مستخدم Android منذ فترة طويلة يقرر التحول إلى iPhone. يفتح Google Authenticator ويصاب بالرعب عندما يكتشف عدم وجود زر بسيط "مزامنة مع هاتفي الجديد". لديه أكثر من 30 حسابًا معدًا، وفكرة المرور بعملية إعادة تعيين المصادقة الثنائية لكل واحد منها كابوس. لكنه يتذكر بعد ذلك سياسته الأمنية الشخصية: لكل خدمة جديدة، كان يحفظ رمز QR الأولي كلقطة شاشة في مدير كلمات المرور المشفر الخاص به. يقوم بتثبيت تطبيق مصادقة جديد على جهاز iPhone الخاص به، ويفتح مدير كلمات المرور، وواحدًا تلو الآخر، يعيد مسح رموز QR المحفوظة. في غضون عشر دقائق، يتم ترحيل جميع الحسابات الثلاثين وتعمل بشكل مثالي.

الدرس: سر TOTP (كسلسلة Base32 أو رمز QR) هو المفتاح الحقيقي. أن تكون مستقلاً عن أي تطبيق مصادقة واحد عن طريق عمل نسخة احتياطية آمنة لأسرارك يمنحك ملكية حقيقية وقابلية للنقل.

أخطاء ومزالق شائعة

  • التعامل مع السر باستهتار. رمز QR أو سلسلة Base32 التي تُعطى لك عند الإعداد هي المفتاح السري. إذا حصل عليه مهاجم، يمكنه إنشاء رموز صالحة إلى الأبد. لا تأخذ لقطة شاشة له وتتركها على سطح المكتب، ولا ترسله لنفسك بالبريد الإلكتروني، ولا تخزنه في ملف نصي عادي. تعامل معه ككلمة مرور رئيسية.
  • نسيان حفظ رموز الاسترداد. عند تمكين المصادقة الثنائية، ستقدم لك كل خدمة تقريبًا مجموعة من رموز الاسترداد التي تستخدم لمرة واحدة. اطبعها. احفظها في مكان آمن (خزنة حقيقية، أو على الأقل، مدير كلمات المرور الخاص بك). إذا فقدت هاتفك، فهذه الرموز هي طريقك الوحيد للعودة إلى حسابك دون عملية دعم مؤلمة.
  • افتراض أن تطبيق المصادقة الخاص بك لديه نسخة احتياطية. العديد من تطبيقات المصادقة البسيطة (مثل Google Authenticator الأصلي) تخزن الأسرار على ذلك الجهاز فقط. إذا ضاع الهاتف أو تم مسحه، فإن الأسرار تضيع إلى الأبد. استخدم تطبيقًا يوفر مزامنة سحابية آمنة ومشفرة (مثل Authy أو 1Password) أو كن منضبطًا بشأن عمل نسخة احتياطية من أسرارك يدويًا.
  • تجاهل انحراف الساعة. يعتمد TOTP على الوقت. إذا كانت ساعة هاتفك متأخرة أو متقدمة بأكثر من دقيقة أو دقيقتين عن الوقت الحقيقي، فسيتم رفض الرموز التي يولدها. اضبط دائمًا هاتفك وجهاز الكمبيوتر على "ضبط الوقت تلقائيًا". يكاد يكون هذا هو السبب دائمًا عندما تتوقف الرموز الصالحة عن العمل فجأة.

لماذا يجب أن يكون على رادارك

إذا كنت مطورًا تبني أي نظام به حسابات مستخدمين، فيجب عليك تطبيق المصادقة متعددة العوامل (MFA)، و TOTP هو الخيار الأفضل في فئته، وهو معيار مفتوح للمصادقة الثنائية (2FA) المستندة إلى التطبيق. إنه أكثر أمانًا من الرسائل القصيرة وأكثر انفتاحًا من أنظمة الإشعارات الفورية الخاصة. إن فهم كيفية إنشاء سر، وإنشاء URI otpauth://، والتحقق من صحة توكن وارد هو مهارة أساسية لبناء تطبيقات آمنة.

حتى لو لم تقم بتطبيق نظام TOTP بنفسك، فأنت مستخدم له على منصات مثل AWS و Cloudflare و GitHub و npm. معرفة كيفية عمل السحر من الداخل تمكنك من استخدامه بشكل أكثر أمانًا. يساعدك على فهم أهمية حماية السر الأولي، وحفظ رموز الاسترداد الخاصة بك، واختيار تطبيق المصادقة المناسب لاحتياجاتك. إنه يزيل الغموض عن ذلك الرقم الصغير المكون من ستة أرقام الذي يقف بين بياناتك والأشرار.

تعمق أكثر

انتهينا من النظرية. حان وقت التطبيق — 100% في متصفحك.

جرّب الأداة: مولّد TOTP / 2FA