تصدیقی ہینڈ شیک
کلائنٹ پورٹ اور کلسٹر کے Raft پورٹ دونوں کا بائٹ بہ بائٹ ایک جیسا مشترک مرحلہ۔ کنکشن قائم ہوتے ہی (اگر TLS استعمال ہو رہا ہو تو TLS ہینڈ شیک مکمل ہونے کے بعد)، سرور پہلے بولتا ہے اور ایک challenge بھیجتا ہے۔ یہ نئی لائن (\n) سے علیحدہ دو لائنوں کا متن تبادلہ ہے، جو فی کنکشن ایک بار کیا جاتا ہے۔
پورٹ کے لحاظ سے صرف ایک چیز مختلف ہوتی ہے — کون سا ٹوکن سیٹ تصدیق کے لیے استعمال ہوتا ہے — کلائنٹ پورٹ client_tokens کے خلاف تصدیق کرتا ہے، Raft پورٹ cluster_tokens کے خلاف۔ Raft-پورٹ کے مخصوص ٹوکن اصولوں (کون سا ٹوکن بھیجا جاتا ہے، اور بغیر کسی تعطل کے ٹوکن کیسے بدلیں) کے لیے کنکشن اور تصدیق (کلسٹر) دیکھیں۔
بہاؤ
رابطہ کار (کلائنٹ · پیئر)
سرور
TCP کنکشن · (TLS ہینڈ شیک)
challenge: SHA-256 ␣ nonce
digest = SHA-256(token ∥ nonce) · 43 حروف
پوری ٹوکن فہرست کے خلاف constant-time موازنہ
کامیابی → کوئی جواب نہیں، پروٹوکول فوراً شروع
پہلی درخواست فوراً بھیجی گئی (مثلاً A · حصول)
اگر ناکام ہو
E · auth_failed → کنکشن بند
درخواستجواب
1. Challenge (سرور → رابطہ کار)
ساختrefresh
<hash> <nonce>\n مثال: SHA-256 aB3dEf_g\n| فیلڈ | مواد |
|---|---|
hash | digest الگورتھم کا نام۔ فی الحال ہمیشہ SHA-256، اور سرور اس کے علاوہ کچھ قبول نہیں کرتا |
nonce | 8-حرفی base64url بے ترتیب قدر۔ فریمنگ نئی لائن سے علیحدہ ہے، اس لیے اس کی لمبائی بعد میں بڑھ سکتی ہے — رابطہ کار کو پہلی اسپیس کے بعد ہر چیز کو nonce سمجھنا چاہیے |
2. Response (رابطہ کار → سرور)
ساختrefresh
<digest>\n
digest = base64url_nopad( SHA-256( token_bytes ∥ nonce_bytes ) )(∥ بائٹ کا الحاق ہے — nonce string کے ASCII بائٹس ٹوکن کے خام بائٹس کے فوراً بعد جوڑے جاتے ہیں)
- base64url بغیر پیڈنگ کے، URL-محفوظ حروف (
A–Z a–z 0–9 - _) استعمال کرتا ہے۔ ایک SHA-256 digest ہمیشہ 43 حروف کا ہوتا ہے۔ - سرور پوری ترتیب شدہ ٹوکن فہرست کے خلاف constant-time موازنہ سے تصدیق کرتا ہے — کون سا ٹوکن میل کھایا، یا موازنہ کہاں تک پہنچا، یہ کبھی بھی وقت کے ذریعے ظاہر نہیں ہوتا۔
- بغیر کسی ٹوکن کے سیٹ کیا گیا سرور ایک خالی ٹوکن
""قبول کرتا ہے۔ اس صورت میں،digest = base64url(SHA-256(nonce))بھیجنا کامیاب ہوتا ہے۔ ہینڈ شیک کا مرحلہ خود کبھی نہیں چھوڑا جا سکتا۔ - سرور جو جواب لائن پڑھتا ہے اس کی حد 256 بائٹس ہے۔
3. نتیجہ
- کامیابی: سرور کچھ نہیں بھیجتا اور سیدھا مرکزی پروٹوکول میں چلا جاتا ہے — کلائنٹ پورٹ پر بائنری فریم لاک پروٹوکول، یا Raft پورٹ پر لمبائی-پریفکس RPC۔ پہلی درخواست فوراً بھیج دیں۔
- ناکامی: سرور
E auth_failedبھیج کر کنکشن بند کر دیتا ہے۔ اگر ہینڈ شیک کے دوران کنکشن منقطع ہو جائے یا کوئی لائن بگڑی ہوئی ہو، تو یہ بغیر کسی خرابی کے فریم کے خاموشی سے بھی بند ہو سکتا ہے۔
اصطلاحات
- challenge-response — ایک تصدیقی طریقہ جس میں راز (ٹوکن) براہ راست بھیجنے کی بجائے، سرور ایک ایک بارہ استعمال ہونے والا سوال (challenge) پیش کرتا ہے اور رابطہ کار صرف جواب بھیج کر ثابت کرتا ہے کہ اسے راز معلوم ہے۔
- nonce — ایک بار استعمال ہونے والا عدد۔ ہر کنکشن پر بدل جاتا ہے، اس لیے چوری شدہ جواب کو replay حملے میں دوبارہ استعمال نہیں کیا جا سکتا۔
- constant-time compare — ایک موازنہ جو ہمیشہ ایک ہی وقت لیتا ہے چاہے یہ کتنا بھی میل کھائے، timing حملوں کو بند کر دیتا ہے جو ورنہ راز ظاہر کر سکتے تھے۔
- base64url — base64 کی ایک قسم جو صرف URL-محفوظ حروف (
A–Z a–z 0–9 - _) استعمال کرتی ہے۔ یہاں بغیر پیڈنگ (=) کے استعمال ہوتی ہے۔