DAT
التوثيق

DAT (Distributed Access Token)

1. نظرة عامة

مع تزايد عدد المستخدمين المتصلين في وقت واحد، يزداد عدد الجلسات (Sessions) بالتوازي، مما يُسبّب ضغطاً زائداً على خادم الجلسات.

DAT هو مواصفة رمز (Token Spec) صُمِّمت لحل مشكلة الضغط على خادم الجلسات، ولتحقيق مصادقة فعّالة لا تتطلب مشاركة الحالة بين الخوادم (Stateless).

يتكوّن DAT من سلسلة نصية مؤلفة من خمسة حقول ثابتة مفصولة بنقاط (.). يمكن اقتطاع كل حقل بالاعتماد على موضع الفاصل وحده دون أي تحليل JSON، كما أن وقت الانتهاء ومنطقة التشفير مُضمَّنان في المواصفة نفسها.


2. تنسيق السلك (Wire Format)

تنسيق سلك DAT
expire
uint64 (عشري)
.
cid
uint64 (ست عشري)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
مرّر المؤشر فوق كل حقل لعرض شرحه.
expire . cid . plain . secure . signature
الحقلالنوعالترميزملاحظات
وقت الانتهاءuint64سلسلة عشريةUnixtime (بالثواني)
CIDuint64سلسلة ست عشريةمعرّف الشهادة
بيانات نصية عاديةBinaryBase64Url (بدون حشو)بيانات عامة
بيانات مشفرةBinaryBase64Url (بدون حشو)بيانات مشفّرة
التوقيعBinaryBase64Url (بدون حشو)توقيع
البنية
مثالrefresh
/

2.1. مواصفات الحقول التفصيلية

وقت الانتهاء : uint64 (Unix Time)

  • يُعبَّر عن وقت انتهاء صلاحية الرمز بعدد صحيح غير موقَّع 64-بت بوحدة الثواني (Seconds).
  • لا يُسمح إلا بأرقام عشرية خالصة. وجود إشارة أو مسافة أو فاصل يُعدّ خطأً في التنسيق.

CID : Hex (uint64)

  • معرّف الشهادة (Certificate ID) المستخدم في التحقق من الرمز.
  • لا يُسمح إلا بأرقام ست عشرية خالصة، ولا تُستخدم البادئة 0x.

بيانات نصية عادية : Base64Url (Binary)

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

بيانات مشفرة : Base64Url (Binary)

  • يحتوي على البيانات المخفية عن العميل. يكون مشفّراً بخوارزمية التشفير المحددة في الشهادة، فلا يستطيع أي عميل لا يملك الشهادة فكّ تشفير محتواه.
  • بنيته الداخلية هي IV(96bit) + النص المشفّر، ويُولَّد IV جديد في كل عملية تشفير.

التوقيع : Base64Url (Binary)

  • بيانات التوقيع للتحقق من عدم تعديل الرمز أو تزويره. تُنشأ بتوقيع الحقول السابقة بخوارزمية التوقيع الخاصة بالشهادة.
  • الرمز الذي يفشل في التحقق من توقيعه يجب ألا يُوثَق بأي حقل من حقوله.

3. القواعد المعيارية (Canonical Rules)

لكي يفسّر العملاء المكتوبون بلغات مختلفة الرمز نفسه بالطريقة نفسها، يجب ألا تختلف القواعد التالية من تنفيذ إلى آخر. التنفيذ المرجعي هو Rust (dat-rust)، وجميع التنفيذات الأخرى مضبوطة على هذه القواعد.

3.1. تحليل الحقول الرقمية

يُفسَّر كل من expire وcid بصرامة. جميع المدخلات التالية تُرفض باعتبارها أخطاء تنسيق.

مثال الإدخالالنتيجةالسبب
100يُقبلعشري خالص
007يُقبلالأصفار البادئة مسموحة
+100يُرفضلا يُسمح بالإشارة
-1يُرفضلا يُسمح بالإشارة
" 100 "يُرفضلا يُسمح بالمسافات
1_0يُرفضلا يُسمح بالفواصل
0x10يُرفضلا يُسمح بالبادئة
zzzzيُرفضليس رقماً
""يُرفضسلسلة فارغة
18446744073709551616يُرفضيتجاوز نطاق uint64

لماذا يجب أن تكون الصرامة مطلوبة

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

3.2. تحديد انتهاء الصلاحية

حدود الانتهاء تختلف بين رمز DAT والشهادة. لا تخلط بينهما.

الهدفشرط الصلاحيةعند لحظة الانتهاء بالضبط (expire == now)
رمز DATexpire > nowيُرفض باعتباره منتهياً
الشهادةexpire >= nowلا يزال صالحاً

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

3.3. حمولة secure الفارغة

إذا لم تكن هناك بيانات لتشفيرها، يكون secure سلسلة فارغة.

  • encrypt(إدخال فارغ) ← إخراج فارغ (لا يُضاف IV ولا وسم GCM)
  • decrypt(إدخال فارغ) ← إخراج فارغ
  • إذا لم يكن فارغاً وكان طوله أقل من أو يساوي طول IV (12 بايت) فهذا خطأ في فك التشفير.
1893456000.1a.SGVsbG8..T3RoZXItc2lnbmF0dXJl
                      ↑ رمز سليم يكون فيه موضع secure فارغاً

4. الإصدار والتحقق

إصدار DAT → التسليم → التحقق
DAT CMS
خادم الإصدار
العميل
خادم التحقق
نشر الشهادة
نشر الشهادة
تسجيل الدخول
issue(plain, secure)
إصدار DAT
طلب مرفق بـ DAT
البحث عن الشهادة عبر CID → التحقق من التوقيع → فك التشفير
استجابة
طلباستجابةمزامنة الشهادات

4.1. إجراءات الإصدار

  1. يختار المدير شهادة قابلة للإصدار (issuable) من بين الشهادات التي يملكها.
  2. يحسب expire = now + dat_ttl_seconds.
  3. يرمّز plain بترميز Base64Url، ويشفّر secure ثم يرمّزه بترميز Base64Url.
  4. يوقّع السلسلة expire.cid.plain.secure ويلحق التوقيع بوصفه الحقل الأخير.

4.2. إجراءات التحقق

  1. يُقسَّم الرمز إلى 5 حقول بالنقطة (.). إذا اختلف عدد الحقول فهذا خطأ في التنسيق.
  2. يُفحص expire. الرمز المنتهي يُرفض قبل التحقق من التوقيع.
  3. يُبحث عن الشهادة عبر cid. إذا لم توجد فالتحقق غير ممكن.
  4. يُتحقق من التوقيع على المقطع expire.cid.plain.secure.
  5. لا يُفكّ تشفير secure إلا بعد نجاح التحقق.

لا توثق بأي قيمة قبل التحقق من التوقيع

تقدّم بعض التنفيذات واجهة برمجية لاستخراج الحقول دون التحقق من التوقيع (من فئة parse without verify). هذه القيم خاضعة بالكامل لتلاعب المهاجم، ويجب استخدامها لأغراض التسجيل والتصحيح فقط.


5. المقارنة مع JWT

يتشارك DAT وJWT (JSON Web Token) في بنية الرمز المقسَّمة بنقاط (.) وأسلوب التحقق عبر التوقيع، غير أن ثمة فوارق جوهرية في التصميم الداخلي على النحو الآتي.

5.1. مقارنة الفروق البنيوية

  • بنية JWT

    headerbodysignature
    Base64Url (JSON String)Base64Url (JSON String)Base64Url (Binary)
  • بنية DAT

    وقت الانتهاءCIDبيانات نصية عاديةبيانات مشفرةالتوقيع
    Unixtime (uint64)Hex (uint64)Base64Url (Binary)Base64Url (Encrypt Binary)Base64Url (Binary)

5.2. الفروق الجوهرية

  • تخفيف الحجم بالاعتماد على Binary: يتعامل JWT مع الترويسة (Header) والجسم (Body) على شكل نصوص JSON، بينما يتعامل DAT مباشرةً مع البيانات الثنائية (Binary)، مما يُحسِّن حجم البيانات ويرفع كفاءة التحليل.
  • دمج الأمان في البنية (حقل بيانات مشفرة): يكشف JWT عن حمولته (Payload) افتراضياً بنص واضح، فإذا لزم التشفير وجب تطبيق مواصفة منفصلة كـ JWE. في المقابل، يدعم DAT التشفير داخل الرمز ذاته عبر حقل بيانات مشفرة.
  • فرض قيد وقت الانتهاء: في JWT يُعدّ حقل exp (Claims) اختيارياً، أما في DAT فإن حقل وقت الانتهاء مفروض في بنية الرمز، مما يجعل التحقق من مدة الصلاحية حتمياً.
  • لا تفاوض على الخوارزمية: يحمل JWT قيمة alg في ترويسته، مما يفتح سطح هجوم خلط الخوارزميات. أما DAT فتحدد الشهادة الخوارزمية، ولا يتضمن الرمز أي معلومات عنها.