Ticketing
दस्तावेज़

प्रमाणीकरण हैंडशेक

क्लाइंट पोर्ट और क्लस्टर के Raft पोर्ट द्वारा बाइट दर बाइट समान रूप से उपयोग किया जाने वाला एक साझा चरण। कनेक्शन स्थापित होते ही (यदि TLS उपयोग में है तो TLS हैंडशेक पूरा होने के बाद), सर्वर पहले बोलता है और एक चैलेंज भेजता है। यह एक दो-लाइन, नई लाइन (\n)-सीमांकित टेक्स्ट आदान-प्रदान है, जो प्रति कनेक्शन एक बार किया जाता है।

पोर्ट के अनुसार केवल एक चीज़ बदलती है: सत्यापन के लिए कौन-सा टोकन सेट उपयोग होता है — क्लाइंट पोर्ट client_tokens के विरुद्ध सत्यापित करता है, Raft पोर्ट cluster_tokens के विरुद्ध। Raft पोर्ट-विशिष्ट टोकन नियमों (कौन-सा टोकन भेजा जाता है, और शून्य डाउनटाइम के साथ टोकन कैसे घुमाएँ) के लिए कनेक्शन और प्रमाणीकरण (क्लस्टर) देखें।

प्रवाह

कनेक्टर (क्लाइंट · पीयर)
सर्वर
TCP कनेक्ट · (TLS हैंडशेक)
चैलेंज: SHA-256 ␣ nonce
digest = SHA-256(token ∥ nonce) · 43 वर्ण
पूरी टोकन सूची के विरुद्ध स्थिर-समय तुलना
सफलता → कोई उत्तर नहीं, प्रोटोकॉल तुरंत शुरू होता है
पहला अनुरोध तुरंत भेजा गया (जैसे A · अधिग्रहण)
यदि विफल हुआ
E · auth_failed → कनेक्शन बंद
अनुरोधप्रतिक्रियासर्वसम्मति RPC (Raft)

1. चैलेंज (सर्वर → कनेक्टर)

संरचनाrefresh
<hash> <nonce>\n            जैसे SHA-256 aB3dEf_g\n
फ़ील्डसामग्री
hashडाइजेस्ट एल्गोरिदम का नाम। वर्तमान में हमेशा SHA-256, और सर्वर इसके अलावा कुछ स्वीकार नहीं करता
nonceएक 8-वर्ण base64url यादृच्छिक मान। फ़्रेमिंग नई लाइन-सीमांकित है, इसलिए इसकी लंबाई बाद में बढ़ सकती है — कनेक्टर को पहले स्पेस के बाद की हर चीज़ को nonce मानना चाहिए

2. प्रतिक्रिया (कनेक्टर → सर्वर)

संरचनाrefresh
<digest>\n

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

( बाइट संयोजन है — nonce स्ट्रिंग के ASCII बाइट, टोकन के रॉ बाइट के ठीक बाद जोड़े जाते हैं)

  • base64url बिना-पैडिंग वाला, URL-सुरक्षित वर्णमाला (A–Z a–z 0–9 - _) है। एक SHA-256 डाइजेस्ट हमेशा 43 वर्ण का होता है।
  • सर्वर पूरी कॉन्फ़िगर की गई टोकन सूची के विरुद्ध एक स्थिर-समय तुलना (constant-time compare) से सत्यापित करता है — कौन-सा टोकन मेल खाया, या तुलना कहाँ तक पहुँची, यह टाइमिंग के ज़रिए कभी नहीं लीक होता।
  • बिना किसी कॉन्फ़िगर किए टोकन वाला सर्वर एक खाली टोकन "" स्वीकार करता है। उस स्थिति में, digest = base64url(SHA-256(nonce)) भेजना पास हो जाता है। हैंडशेक चरण को स्वयं कभी छोड़ा नहीं जा सकता।
  • सर्वर जिस प्रतिक्रिया लाइन को पढ़ता है वह 256 बाइट तक सीमित है।

3. परिणाम

  • सफलता: सर्वर कुछ नहीं भेजता और सीधे मुख्य प्रोटोकॉल में स्विच हो जाता है — क्लाइंट पोर्ट पर बाइनरी फ़्रेम लॉक प्रोटोकॉल, या Raft पोर्ट पर लंबाई-प्रीफ़िक्स्ड RPC। पहला अनुरोध तुरंत भेज दें।
  • विफलता: सर्वर E auth_failed भेजता है और कनेक्शन बंद कर देता है। यदि हैंडशेक के बीच में कनेक्शन टूट जाता है या कोई लाइन विकृत है, तो यह बिना किसी त्रुटि फ़्रेम के भी चुपचाप बंद हो सकता है।

शब्दावली

  • चैलेंज-रिस्पॉन्स (challenge-response) — एक प्रमाणीकरण योजना जहाँ, गुप्त (टोकन) को सीधे भेजने के बजाय, सर्वर एक बार का चैलेंज प्रस्तुत करता है और कनेक्टर केवल उत्तर वापस भेजकर साबित करता है कि वह गुप्त जानता है।
  • nonce — एक बार उपयोग की जाने वाली संख्या। यह हर कनेक्शन पर बदलती है, इसलिए एक चुराई गई प्रतिक्रिया को रीप्ले हमले में दोबारा उपयोग नहीं किया जा सकता।
  • स्थिर-समय तुलना (constant-time compare) — एक तुलना जो तुलना कहाँ तक मेल खाई इससे स्वतंत्र होकर हमेशा समान समय लेती है, जिससे टाइमिंग हमले बंद हो जाते हैं जो अन्यथा गुप्त को लीक कर सकते थे।
  • base64url — केवल URL-सुरक्षित वर्णमाला (A–Z a–z 0–9 - _) का उपयोग करने वाला एक base64 वेरिएंट। यहाँ इसे बिना पैडिंग (=) के उपयोग किया गया है।