كيف يعمل TOTP: الرياضيات خلف رمزك المكوّن من 6 أرقام
شرح مبسّط لكيفية توليد رموز كلمة المرور لمرة واحدة المعتمدة على الوقت، من المفتاح السري المشترك حتى الأرقام الستة التي تكتبها.
ما هو رمز TOTP فعليًا
افتح تطبيق المصادقة (Authenticator) وسترى رقماً من 6 أرقام يعد تنازلياً خلال عمره البالغ 30 ثانية. هذا الرقم هو رمز TOTP: كلمة مرور تُستخدم مرة واحدة وتعتمد على الوقت، وقد وُحّدت في RFC 6238 كامتداد للمخطط الأقدم القائم على HMAC وهو HOTP.
الفكرة الأساسية: الرمز ليس كلمة مرور. إنه إثبات بأنك تملك سراً مشتركاً — قيمة ثُبّتت على جهازك عند إعداد المصادقة الثنائية (2FA) لأول مرة. وبما أن الرمز مشتق من ذلك السر زائد الوقت الحالي، فإنه يتغير كل 30 ثانية ولا فائدة له لأي شخص يلمحه بعد كتابتك له.
لا ينتقل أي شيء لكي يعمل هذا. لا رسائل SMS، ولا اتصال بخادم تسجيل الدخول، ولا شبكة إطلاقاً. يقوم تطبيقك والخادم بإجراء نفس العملية الحسابية بشكل مستقل، اعتماداً على ساعتيهما. نفس المدخلات، نفس الحساب، نفس الرمز — هذه هي الحيلة بأكملها.
عملياً، هذا يعني أن الرمز صالح للاستخدام مرة واحدة فقط: بمجرد قبول الخادم له، يُرفض تكراره حتى لو كتبته خلال الثواني المتبقية من نافذته الزمنية. والفارق بينه وبين HOTP أن HOTP يعتمد على عدّاد يزداد مع كل استخدام، بينما يُشتق TOTP من رقم زمني متجدد — لذا لا يحتاج الخادم لتتبع آخر عدّاد استخدمته، بل يحسب الرموز المحيطة بالوقت الحالي فقط، عادةً نافذة واحدة قبلها وبعدها كضمانة بسيطة لتأخر الساعة أو الشبكة.
السر المشترك: حيث يبدأ كل شيء
عند تفعيل المصادقة الثنائية (2FA) على حساب ما، يُنشئ الخادم مفتاحًا سريًا عشوائيًا — عادةً 20 بايت من العشوائية التشفيرية. هذه السلسلة الوحيدة من الأحرف هي جذر كل ما يليها.
يمنحه لك الخادم مرة واحدة، عادةً على شكل رمز QR. ما يبدو كنمط من البكسلات هو في الحقيقة نص مُرمَّز فقط: السر نفسه، مكتوبًا بترميز Base32 (الأحرف A–Z والأرقام 2–7)، إضافة إلى اسم الحساب والجهة المُصدِرة. يمسحه تطبيق المصادقة لديك، ويفك ترميزه، ويخزّن السر محليًا.
بعض المواقع تعرض أيضًا السر كنص مكتوب أسفل رمز QR. هذا مفيد إذا لم يكن لديك كاميرا أو فشل المسح: يمكنك كتابة السر يدويًا في التطبيق. انتبه إلى أن Base32 لا يستخدم الأرقام 0 و1 و8 و9 تحديدًا لتفادي الخلط بينها وبين الحروف O وI وB — فإذا أخطأت في نسخ حرف واحد، سينتج تطبيقك رموزًا خاطئة تمامًا دون أي تحذير.
من تلك اللحظة، توجد نسختان من السر نفسه: واحدة على الخادم، وأخرى في تطبيقك. لا تُرسَل أي منهما عبر الشبكة مرة أخرى أبدًا. كل رمز مستقبلي مشتق من هذه القيمة المشتركة — ولهذا فإن حمايتها أمر مهم.
لقطة شاشة لرمز QR هذا هي نسخة دائمة من مفتاحك. أي شخص يراها يستطيع توليد رموز صالحة إلى الأبد. امسحها، ثم احذفها. لا تحفظ السر في ملاحظات غير مشفَّرة أو في محادثة مع نفسك؛ إذا أردت نسخة احتياطية، استخدم مدير كلمات مرور يشفّر بياناتك.
خطوة الزمن: عدّاد متحرك
لا يستخدم TOTP الساعة الخام مباشرةً. بدلاً من ذلك، يأخذ كلٌّ من تطبيقك والخادم طابع Unix الزمني الحالي (الثواني منذ 1970) ويقسمانه على 30، مع تجاهل الباقي:
counter = floor(unix_time / 30)
النتيجة عدد صحيح بسيط يزيد بمقدار واحد كل 30 ثانية. في لحظة كتابة هذا النص، يكون ذلك العدّاد رقماً ضخماً — لكن التطبيق يهتم فقط بأن يحسب الطرفان القيمة نفسها. عدّاد متماثل زائد سرّ متماثل يعني رمزاً متماثلاً.
الفترة الزمنية البالغة 30 ثانية مقصودة: أقصر من ذلك يجعل الرمز يختفي قبل أن تكتبه، وأطول منها يزيد فرصة استخدام رمز مسروق قبل انتهائه. لهذا يعرض تطبيقك غالباً شريطاً دائرياً أو عدداً تنازلياً — إنه الوقت المتبقي قبل توليد عدّاد جديد ورمز مختلف تماماً.
لماذا ينكسر انحراف الساعة الرموز
يعتمد النظام كله على التطابق. إذا كانت ساعة هاتفك متأخرة أو متقدمة بـ 40 ثانية، فستحسب العدّاد N بينما الخادم وصل بالفعل إلى N+1 — رموز مختلفة، وخطأ "رمز غير صالح"، حتى لو أدخلته بدقة تامة.
الخوادم تعلم أن الساعات تنحرف، لذا يقبل معظمها رمز خطوة الزمن السابقة أو التالية كنافذة سماح. وإن تجاوزت ذلك، فأعد مزامنة ساعة جهازك (اضبطها على الوضع التلقائي). الخطأ الشائع: تعديل الساعة يدوياً بمقدار ثوانٍ معدودة — حل مؤقت يخفي المشكلة بدل أن يعالجها، لذا اعتمد المزامنة التلقائية عبر الشبكة دائماً.
HMAC: خلط المفتاح السري مع العدّاد
في قلب كل رمز TOTP تقوم دالة واحدة: HMAC-SHA1. HMAC هو اختصار لـ Hash-based Message Authentication Code (رمز مصادقة الرسالة المعتمد على التجزئة)، ومهمته هنا بسيطة — مزج مُدخَلين في مخرَج واحد غير قابل للتوقّع.
المُدخَلان:
- المفتاح السري المشترك — المفتاح الذي لا يعرفه إلا هاتفك والخادم
- عدّاد الوقت — الرقم الذي يتغيّر كل 30 ثانية
فكّر في HMAC بوصفه دالة تجزئة بمفتاح. التجزئة العادية تبعثر البيانات بالطريقة نفسها في كل مرة. أما HMAC فيبعثرها بطريقة تختلف باختلاف المفتاح. أدخِل إليه المفتاح السري نفسه مع العدّاد 48291 وستحصل دائمًا على النتيجة نفسها بطول 20 بايت. غيّر العدّاد بمقدار واحد، فيتحوّل الناتج إلى شيء يبدو لا صلة له إطلاقًا.
هذا التغيّر الجذري يُسمّى "تأثير الانهيار الجليدي": حتى فرق بايت واحد في المُدخل يغيّر نحو نصف بتات المخرَج. لذلك لا يمكن لأي مهاجم يلاحظ رمزين متتاليين أن يستنتج شكل الرمز الثالث.
كيف تعمل الدالة داخليًا، باختصار؟ ثلاث خطوات:
- يُحشَى المفتاح السري بالأصفار حتى يصل طول 64 بايت
- يُدمَج المفتاح مع قيمتين ثابتتين، واحدة تلو الأخرى، فتنشأ حالتان تجزئة مختلفتان
- تُجزَّأ نتيجة الدمج مع العدّاد، ثم تُجزَّأ الناتج مرة ثانية
الخطوتان في المنتصف هما سر قوة HMAC: حتى لو كانت التجزئة الأساسية SHA1 ضعيفة نسبيًا اليوم، يبقى HMAC-SHA1 آمنًا لهذا الغرض لأن كسره يتطلب معرفة المفتاح نفسه، لا مجرد حساب تجزئات سريع.
والأهم من ذلك أن العملية تسير في اتجاه واحد فقط. رؤية ملايين المخرجات لا تُخبر المهاجم شيئًا قابلًا للاستفادة عن المفتاح السري — وهذه هي الخاصية التي تجعل النظام بأكمله آمنًا.
الاقتطاع: الانتقال من 20 بايتًا إلى 6 أرقام
ينتج HMAC-SHA-1 عشرين بايتًا — أكثر بكثير مما يمكن لشاشة عرض عرضه بشكل معقول. يضغط TOTP هذا عبر الاقتطاع الديناميكي:
- خذ نصف البايت الأخير (أقل 4 بتات) من مخرجات HMAC. يعطيك هذا رقمًا من 0 إلى 15.
- استخدمه كإزاحة: خذ الـ 4 بايتات بدءًا من ذلك الموضع في المخرجات. إذا كان الرقم 9 مثلًا، تبدأ من البايت التاسع وتأخذ أربعة بايتات متتالية.
- صفِّر البت الأعلى من تلك الـ 4 بايتات، تاركًا عددًا صحيحًا من 31 بت. هذه الخطوة ضرورية لأن بعض لغات البرمجة تتعامل مع البت الأعلى كإشارة سالب، مما قد يفسد الحساب لاحقًا.
ما يزال هذا العدد الصحيح كبيرًا جدًا على العرض، لذا يُختزل بباقي القسمة على 1,000,000. الباقي — أيًا كان، من 0 إلى 999,999 — يصبح الرمز، مع حشوه بالأصفار حتى يبلغ 6 أرقام. باقٍ من 4,207 يُعرض كـ 042207. الحشو ليس تجميلًا: التطبيقات تتحقق من الرمز كنص_fixed_العنصر، وإذا أرسلت "4207" فقط سيفشل التطابق حتى لو كان العدد صحيحًا.
يُسمى ديناميكيًا لأن الإزاحة تأتي من البيانات نفسها: كل رمز يأخذ عينة من شريحة مختلفة من مخرجات HMAC. لو كانت الإزاحة ثابتة، لاستُخدمت دائمًا نفس البايتات الأربعة، مما يقلل التنوع ويضعف الأمان.
بعض الخدمات تستخدم رموزًا من 7 أو 8 أرقام، بأخذ باقي القسمة على 10,000,000 أو 100,000,000 بدلًا من ذلك — نفس العملية الحسابية، مساحة رموز أكبر، وصعوبة تخمين أكبر.
لماذا من الآمن كتابة الرمز
الرمز المكوّن من 6 أرقام يوفّر مليون قيمة ممكنة — رقم متواضع على الورق. لكن ما يجعله فعالاً هو أنك لا تحصل إلا على عدد قليل من محاولات التخمين. تحدّ الخوادم من معدّل محاولات تسجيل الدخول وترفض المحاولات الفاشلة المتكررة، فلا يستطيع المهاجم تجربة التركيبات تباعاً. قد يُقفل الحساب مؤقتاً بعد بضع محاولات خاطئة، أو تُفرض فترة انتظار قصيرة بين كل محاولة وأخرى. الحدّ من المعدل، لا طول الرمز، هو الدفاع الحقيقي.
كل رمز قصير العمر أيضاً. فهو مرتبط بنافذة زمنية مدّتها 30 ثانية ويُقبل لفترة وجيزة فقط حولها، فينتهي صلاحية الرمز المسروق قبل أن يمكن إعادة استخدامه. حتى لو التقاط المهاجم رمزاً أثناء إرساله، فإن محاولة استخدامه تتنافس مع العدّ الثواني.
وأخيراً، رؤية رمز لا تكشف شيئاً عن المستقبل. الرمز هو ناتج عملية حسابية من نوع HMAC باستخدام مفتاحك السري. HMAC دالة أحادية الاتجاه: بالنظر إلى الناتج، لا توجد طريقة لإعادة بناء المُدخل. المهاجم الذي يلمّح برمز اليوم لا يستطيع اشتقاق السر، ولا يمكنه التنبؤ برمز الغد — لأنه لا يعرف قيمة الاقتران الخاصة بالعدّاد الكامنة تحته.
الخطر الحقيقي يأتي من مكان آخر: تصيّد يطلب منك الرمز مباشرة، أو سرقة جهاز فيه تطبيق المصادقة دون قفل. لهذا لا تشارك رمزاً حيّاً مع أحد، مهما بدا الطلب مشروعاً.
الأسئلة الشائعة والحالات الخاصة
لماذا تفشل الرموز؟
السبب الأكثر شيوعًا هو انحراف الساعة. يجب أن تبقى ساعة هاتفك وساعة الخادم ضمن النافذة المسموحة، لذا فإن الهاتف الذي يعرض وقتًا خاطئًا يُنتج رموزًا خاطئة. الحل: فعِّل مزامنة الوقت التلقائية. إذا كنت مسافرًا وبدّلت المناطق الزمنية يدويًا، فلا تقلق—التوقيت العالمي المنسق هو المعيار، والتبديل اليدوي للمنطقة الزمنية لا يؤثر عادةً على الرموز. المشكلة الحقيقية تظهر عند تعطيل المزامنة التلقائية أو عند تعطل خادم الوقت.
السر الخاطئ يفشل أيضًا بصمت—يحدث هذا عادةً عندما يُمسح رمز QR إلى إعداد حساب مختلف. الأعراض: التطبيق يعرض رموزًا تبدو صحيحة، لكن الخادم يرفضها دائمًا. لا حيلة لك هنا سوى إعادة التسجيل من الإعدادات الأمنية للحساب.
أخيرًا، رموز QR قد تنتهي صلاحيتها: تُلغي خدمات كثيرة رمز التسجيل بعد فترة قصيرة أو بعد تجاوزك الشاشة، لذا فإن لقطة شاشة قديمة لن تعمل. امسح الرمز فورًا، ولا تحتفظ بلقطة شاشة له—فهي تسرّب السر المشترك نفسه إذا تسربت صورتها.
هل يمكن إعادة استخدام الرمز؟
نعم، تقنيًا—لكن معظم الخوادم ترفض رمزًا سبق قبوله ضمن الخطوة الزمنية الحالية. هذا يمنع المهاجمين الذين لمحوا رمزًا وأعادوا استخدامه بعد ثوانٍ. انتبه: إذا فتحت صفحة تسجيل الدخول في تبويبين وأدخلت الرمز في كليهما، فسيفشل الثاني.
إذا فقدت الجهاز
السر المشترك موجود على جهازك فقط، لذا فقدانه يعني فقدان الوصول—إلا إذا حفظت رموز الاسترداد عند إعداد 2FA. خزّنها دون اتصال—ورقة مطبوعة في مكان آمن أفضل من ملاحظة سحابية، لأن الحساب السحابي نفسه قد يكون هدفًا. كل رمز يعمل مرة واحدة عادةً. جرّب رمزًا واحدًا مسبقًا للتأكد من حفظها بشكل صحيح.
جمع كل شيء: التدفق الكامل
كل شيء يتلخص في مسار واحد: المفتاح السري المشترك → عدّاد الوقت → HMAC → البتر → 6 أرقام.
دورة واحدة مدتها 30 ثانية، من البداية إلى النهاية:
- أثناء الإعداد، تمسح رمز QR. يخزّن تطبيقك المفتاح السري المشترك. لا تنسخ الرمز لاحقًا في لقطة شاشة أو ملف مشترك—من يملكه يملك حسابك.
- في الساعة 12:04:30، يحسب التطبيق خطوة الوقت الحالية (نحو 24,000 إذا العد من حقبة يونكس بفترات 30 ثانية).
- يمزج HMAC-SHA1 المفتاح السري مع ذلك العدّاد، فينتج 20 بايت.
- يختار البتر 4 من تلك البايتات، ويحوّلها إلى رقم، ويحتفظ بآخر 6 أرقام: مثلًا 482913.
- تكتبه. الخادم، الذي يملك المفتاح السري نفسه، ينفذ الحساب المطابق—مع السماح بانحراف خطوة أو اثنتين لفروق الساعات—فتتطابق الرموز. اكتبه في آخر 5 ثوانٍ من النافذة وسيصل بعد انتهاء صلاحيته؛ أعد توليد رمز جديد بدلًا من إعادة المحاولة بنفس الرمز.
عادةتان تحميان السلسلة بأكملها: تعامل مع رمز QR كأنه كلمة مرور، وأبقِ ساعة جهازك مضبوطة على الوضع التلقائي—فرق دقيقتين يكفي لرفض رمز صحيح. إذا فعلت ذلك، يتولى الرياضيات الباقي بنفسه.
شارك هذا الدليل
أحدث ما في المدونة
نسيت رمز التحقق 2FA: ماذا يحدث وكيف تستعيده؟
ماذا يحدث إذا فقدت رمز التحقق 2FA؟ أكواد النسخ الاحتياطي، خطوات استعادة الحساب، وخطوات التحضير كي لا يتكرر ذلك.
اقرأ المزيدقائمة فحص أمان 2FA: 12 خطوة لتأمين حساباتك اليوم
قائمة فحص عملية للأمان تغطي إعداد 2FA والعناية بكلمات المرور وخيارات الاسترداد. اثنتا عشرة خطوة ملموسة يمكنك اتخاذها اليوم لتقوية حساباتك ضد الاستيلاء عليها.
اقرأ المزيدتاريخ المصادقة الثنائية: من الرموز المادية إلى مفاتيح المرور
كيف تطورت المصادقة الثنائية من الرموز المادية وأكواد SMS إلى مفاتيح مرور مقاومة للتصيّد — ولماذا حدثت كل خطوة.
اقرأ المزيد