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

توجد ساعتان مهمتان هنا، وإصلاح الساعة الظاهرة هو ما يفعله الناس أولاً. أما الساعة التي تحتاج إلى انتباه عادةً فهي الأخرى.

الرمز دالة للوقت، وليس كلمة مرور

يأخذ TOTP السر المشترك وعدّادًا مشتقًا من الوقت الحالي، ويمرر كليهما عبر تجزئة بمفتاح، ثم يقتطع النتيجة إلى سلسلة عشرية قصيرة، وفقًا لما هو محدد في RFC 6238. يتقدم العدّاد مع كل خطوة زمنية، وهي ثلاثون ثانية عادةً، فينتج السر نفسه قيمة جديدة عند تغيّر الخطوة. يعيد المتحقق حساب القيمة المتوقعة للخطوة الحالية ويقارنها، وهذا يتطلب السر نفسه والفكرة نفسها عن اللحظة الحالية. تبقى كلمة المرور قابلة لإعادة الاستخدام حتى تُغيَّر، بينما تنتهي صلاحية هذه القيمة عند حد لا يراه العميل.

لهذا يعمل رمز ويفشل الذي يليه بعد لحظات. ويفسر ذلك أيضًا سبب كون نسخ رمز من رسالة دردشة عادةً غير موثوقة إلى هذا الحد.

يجب أن تتفق الساعتان، لا واحدة فقط

مواد التسجيل هي الشيء المشترك الأول، والوقت هو الثاني. إذا كان السر صحيحًا بينما تختلف الساعتان بأكثر من النافذة المسموحة، فستقع كل قيمة مُولَّدة في الخطوة الخطأ وتُرفض. وإذا اتفقت الساعتان بينما كان السر خطأً، فستُرفض كل قيمة أيضًا، ومن ثم فإن يبدو الفشلان متطابقين من شاشة تسجيل الدخول. وفصلهما يعني فحص إدخال الحساب والوقت بشكل مستقل، وبهذا الترتيب.

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

ما تكلفته توسيع النافذة

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

تصحيح الساعة هو الإصلاح، أما توسيع النافذة فهو مسكّن. الأول يزيل السبب والثاني يخفيه.

افحص الساعتين قبل أن تعيد المحاولة

اقرأ الوقت على الجهاز وعلى الخادم، وقارن الفروق بدل الأوقات المحلية المعروضة. تُظهر الأوامر أدناه حالة المزامنة واللحظة الخام بتوقيت UTC على مضيف أو خادم Linux. شغّلها على الطرفين قبل تغيير أي إعداد من إعدادات المصادقة.

timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status

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

سجّل وقت الرفض والفرق ونص الخطأ، واستبعد السر المشترك من ذلك. يمكن للدعم العمل بالعناصر الثلاثة الأولى، وينبغي ألا يرى الرابع أبدًا.

مقالات ذات صلة