Ticketing
التوثيق

مصافحة المصادقة

خطوة مشتركة يستخدمها منفذ العميل ومنفذ Raft للعنقود بشكل مطابق بايتًا ببايت. بمجرد إنشاء الاتصال (بعد اكتمال مصافحة TLS، إن استُخدمت)، يتكلم الخادم أولًا ويرسل challenge. إنه تبادل نصي من سطرين مفصولين بسطر جديد (\n)، يُنفَّذ مرة واحدة لكل اتصال.

الشيء الوحيد الذي يختلف حسب المنفذ هو مجموعة الرموز المستخدمة للتحقق — يتحقق منفذ العميل مقابل client_tokens، ومنفذ Raft مقابل cluster_tokens. راجع الاتصال والمصادقة (العنقود) لقواعد الرموز الخاصة بمنفذ Raft (أي رمز يُرسَل، وكيفية تدوير الرموز دون انقطاع).

التدفق

المتصل (عميل · قرين)
الخادم
اتصال TCP · (مصافحة TLS)
challenge: SHA-256 ␣ nonce
digest = SHA-256(token ∥ nonce) · 43 حرفًا
مقارنة بثابت زمني مع قائمة الرموز كاملة
نجاح ← لا رد، يبدأ البروتوكول الأساسي فورًا
يُرسَل أول طلب فورًا (مثل A · حصول)
إن فشلت
E · auth_failed ← إغلاق الاتصال
طلباستجابة

1. Challenge (الخادم ← المتصل)

البنيةrefresh
<hash> <nonce>\n            مثل: SHA-256 aB3dEf_g\n
الحقلالمحتوى
hashاسم خوارزمية الملخص. حاليًا دائمًا SHA-256، ولا يقبل الخادم غيره
nonceقيمة عشوائية من 8 أحرف بأبجدية base64url. التأطير مفصول بسطر جديد، فقد يزيد طولها لاحقًا — يجب على المتصل معاملة كل ما بعد المسافة الأولى كـ nonce

2. Response (المتصل ← الخادم)

البنيةrefresh
<digest>\n

digest = base64url_nopad( SHA-256( token_bytes ∥ nonce_bytes ) )

( هو ضم البايتات — تُلحَق بايتات ASCII لسلسلة nonce مباشرة بعد البايتات الخام للرمز)

  • base64url هي الأبجدية الآمنة لعناوين URL بلا حشو (A–Z a–z 0–9 - _). يكون ملخص SHA-256 دائمًا 43 حرفًا.
  • يتحقق الخادم بـمقارنة بثابت زمني مقابل قائمة الرموز المُعدَّة كاملة — فلا يتسرب عبر التوقيت أي رمز تطابق أو إلى أي مدى وصلت المقارنة.
  • الخادم غير المُعدّة له رموز يقبل رمزًا فارغًا واحدًا "". في تلك الحالة، يمر إرسال digest = base64url(SHA-256(nonce)). لا يمكن تخطي خطوة المصافحة نفسها أبدًا.
  • الحد الأقصى لسطر الاستجابة الذي يقرؤه الخادم هو 256 بايت.

3. النتيجة

  • النجاح: لا يرسل الخادم شيئًا وينتقل مباشرة إلى البروتوكول الأساسي — بروتوكول الإطارات الثنائي للقفل على منفذ العميل، أو RPC مسبوق بالطول على منفذ Raft. أرسل أول طلب فورًا.
  • الفشل: يرسل الخادم E auth_failed ثم يغلق الاتصال. إذا انقطع الاتصال أو كان السطر مشوَّهًا أثناء المصافحة، فقد يُغلَق أيضًا بصمت دون إطار خطأ.

المصطلحات

  • challenge-response — أسلوب مصادقة لا يرسل فيه السر (الرمز) مباشرة، بل يطرح الخادم مسألة لمرة واحدة (challenge) ويثبت المتصل معرفته بالسر بإرسال الإجابة فقط.
  • nonce — رقم يُستخدم مرة واحدة. يتغير مع كل اتصال، فلا يمكن إعادة استخدام استجابة مسروقة في هجوم إعادة (replay).
  • مقارنة بثابت زمني (constant-time compare) — مقارنة تستغرق دائمًا نفس الوقت بغض النظر عن مدى التطابق، مما يغلق هجمات التوقيت التي قد تسرّب السر.
  • base64url — نسخة من base64 تستخدم أبجدية آمنة لعناوين URL فقط (A–Z a–z 0–9 - _). تُستخدم هنا دون حشو (=).