Ticketing
ডকুমেন্টেশন

প্রমাণীকরণ হ্যান্ডশেক

ক্লায়েন্ট পোর্ট এবং ক্লাস্টারের Raft পোর্ট উভয়ই বাইট-বাই-বাইট অভিন্নভাবে ব্যবহার করে এমন একটি শেয়ার্ড ধাপ। সংযোগ স্থাপিত হওয়ার পর (TLS ব্যবহার হলে TLS হ্যান্ডশেক শেষে), সার্ভার আগে challenge পাঠায়। এটি নিউলাইন (\n)-বিভক্ত দুই-লাইনের টেক্সট আদান-প্রদান, প্রতি সংযোগে একবার সম্পন্ন হয়।

পোর্ট অনুযায়ী শুধু যাচাইয়ে ব্যবহৃত টোকেন সেট ভিন্ন হয় — ক্লায়েন্ট পোর্ট client_tokens দিয়ে, আর Raft পোর্ট cluster_tokens দিয়ে যাচাই করে। Raft-পোর্ট-নির্দিষ্ট টোকেন নিয়মের জন্য (কোন টোকেন পাঠানো হয়, শূন্য-ডাউনটাইমে টোকেন কীভাবে ঘোরানো হয়) দেখুন সংযোগ ও প্রমাণীকরণ (ক্লাস্টার)

প্রবাহ

সংযোগকারী (ক্লায়েন্ট · পিয়ার)
সার্ভার
TCP সংযোগ · (TLS হ্যান্ডশেক)
challenge: SHA-256 ␣ nonce
digest = SHA-256(token ∥ nonce) · ৪৩ অক্ষর
সম্পূর্ণ টোকেন তালিকার সাথে ধ্রুবক-সময় তুলনা
সফল হলে → কোনো সাড়া নেই, সঙ্গে সঙ্গে মূল প্রোটোকল শুরু
প্রথম অনুরোধ সরাসরি পাঠানো (যেমন A · অর্জন)
ব্যর্থ হলে
E · auth_failed → সংযোগ বন্ধ
অনুরোধপ্রতিক্রিয়া

১. Challenge (সার্ভার → সংযোগকারী)

গঠনrefresh
<hash> <nonce>\n            যেমন: SHA-256 aB3dEf_g\n
ফিল্ডবিষয়বস্তু
hashডাইজেস্ট অ্যালগরিদমের নাম। বর্তমানে সবসময় SHA-256, সার্ভার আর কিছুই গ্রহণ করে না
noncebase64url বর্ণমালার ৮-অক্ষরের র‍্যান্ডম মান। ফ্রেমিং নিউলাইন-বিভক্ত বলে দৈর্ঘ্য পরে বাড়তে পারে — সংযোগকারীকে অবশ্যই প্রথম স্পেসের পরের সবটুকু nonce হিসেবে ধরতে হবে

২. Response (সংযোগকারী → সার্ভার)

গঠনrefresh
<digest>\n

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

( হলো বাইট সংযোজন — টোকেনের কাঁচা বাইটের ঠিক পরেই nonce স্ট্রিং-এর ASCII বাইট জোড়া লাগানো হয়)

  • base64url হলো প্যাডিং-ছাড়া, url-নিরাপদ বর্ণমালা (A–Z a–z 0–9 - _)। SHA-256 ডাইজেস্ট সবসময় ৪৩ অক্ষরের হয়।
  • সার্ভার কনফিগার করা সম্পূর্ণ টোকেন তালিকার বিপরীতে ধ্রুবক-সময় তুলনা দিয়ে যাচাই করে — কোন টোকেন মিলেছে, বা তুলনা কত দূর পৌঁছেছে, তা টাইমিং দিয়ে ফাঁস হয় না।
  • কোনো টোকেন কনফিগার না করা সার্ভার একটি খালি টোকেন "" গ্রহণ করে। সেক্ষেত্রে digest = base64url(SHA-256(nonce)) পাঠালেই পাস হয়। হ্যান্ডশেক ধাপটি নিজেই কখনো বাদ দেওয়া যায় না।
  • সার্ভার যে সাড়ার লাইন পড়ে তার সীমা ২৫৬ বাইট।

৩. ফলাফল

  • সফল: সার্ভার কিছুই পাঠায় না এবং সরাসরি মূল প্রোটোকলে পরিবর্তিত হয় — ক্লায়েন্ট পোর্টে বাইনারি ফ্রেম লক প্রোটোকল, Raft পোর্টে দৈর্ঘ্য-প্রিফিক্সড RPC। প্রথম অনুরোধ সরাসরি পাঠালেই হয়।
  • ব্যর্থ: সার্ভার E auth_failed পাঠিয়ে সংযোগ বন্ধ করে। হ্যান্ডশেকের মাঝে সংযোগ বিচ্ছিন্ন হলে বা লাইন অস্বাভাবিক হলে ত্রুটি ফ্রেম ছাড়াই নীরবে বন্ধ হতে পারে।

পরিভাষা

  • challenge-response — গোপন তথ্য (টোকেন) সরাসরি না পাঠিয়ে, সার্ভারের দেওয়া এক-বারের সমস্যা (challenge) গোপন তথ্য দিয়ে সমাধান করে শুধু উত্তরটাই পাঠানোর প্রমাণীকরণ পদ্ধতি।
  • nonce — একবারই ব্যবহৃত (number used once) র‍্যান্ডম মান। প্রতি সংযোগে ভিন্ন হয় বলে চুরি করা সাড়া পুনরায় ব্যবহার (replay আক্রমণ) করা যায় না।
  • ধ্রুবক-সময় তুলনা (constant-time compare) — কতদূর মিলেছে তা নির্বিশেষে সবসময় একই সময় লাগে এমন তুলনা। সাড়ার সময়ের পার্থক্য দিয়ে গোপন তথ্য ফাঁস করা টাইমিং আক্রমণ ঠেকায়।
  • base64url — শুধু URL-নিরাপদ বর্ণমালা (A–Z a–z 0–9 - _) ব্যবহারকারী base64-এর একটি রূপ। এখানে প্যাডিং (=) ছাড়া ব্যবহৃত হয়।