- মৌলিক ইনপুট পার্থক্য: HOTP একটি ক্রমবর্ধমান কাউন্টার C (monotonically increasing counter C) থেকে হ্যাশ গণনা করে, যেখানে TOTP কাউন্টার C-কে একটি ইপক টাইম-স্টেপ T (CurrentUnixTime / 30) দিয়ে প্রতিস্থাপন করে।
- সরাসরি উত্তরাধিকার: গাণিতিকভাবে TOTP মূলত HOTP-এরই একটি বিশেষ রূপ:
TOTP(K, Time) = HOTP(K, T)। উভয় অ্যালগরিদম হুবহু একই Dynamic Truncation ফাংশন ব্যবহার করে। - আর্কিটেকচারাল নির্ণায়ক উপাদান: HOTP হলো স্টেটফুল (প্রতিটি যাচাইকরণের সময় সার্ভারকে ডিস্কে কাউন্টার লক এবং সংরক্ষণ করতে হয়)। আর TOTP হলো স্টেটলেস, যা আধুনিক ক্লাউড মাইক্রোসার্ভিসগুলোকে কোনো কেন্দ্রীভূত ডেটাবেসে লেখার ঝামেলা ছাড়াই বিতরণকৃত লোড-ব্যালেন্সড ক্লাস্টারে টোকেন যাচাই করার সুবিধা দেয়।
ঐতিহাসিক পটভূমি: মালিকানাধীন হার্ডওয়্যার টোকেন থেকে উন্মুক্ত ওয়েব স্ট্যান্ডার্ড
২০০০-এর দশকের শুরুতে করপোরেট দ্বি-পদক্ষেপ প্রমাণীকরণে RSA SecurID-এর মতো মালিকানাধীন (proprietary) কি-ফোবগুলোর আধিপত্য ছিল। এই ব্যয়বহুল এবং আবদ্ধ ডিভাইসগুলোতে অভ্যন্তরীণ কোয়ার্টজ ক্রিস্টাল থাকত, যা এন্টারপ্রাইজ সার্ভারের সাথে সিঙ্ক করা থাকত। কোনো সংস্থা যদি হাজার হাজার কর্মীকে মাল্টি-ফ্যাক্টর নিরাপত্তা দিতে চাইত, তবে হার্ডওয়্যার সংগ্রহ এবং মালিকানাধীন লাইসেন্সিং খরচ ছিল আকাশচুম্বী।
মালিকানাধীন বিক্রেতাদের ওপর থেকে এই নির্ভরতা দূর করতে শিল্পের নেতৃস্থানীয় প্রতিষ্ঠানগুলো OATH (Initiative for Open Authentication) কনসোর্টিয়াম গঠন করে, যাতে উন্মুক্ত এবং রয়্যালটি-মুক্ত IETF স্ট্যান্ডার্ড তৈরি করা যায় যা যেকোনো সফটওয়্যার ইঞ্জিনিয়ার স্বাধীনভাবে পরীক্ষা, বাস্তবায়ন এবং অডিট করতে পারেন:
HMAC-Based One-Time Password Algorithm। ফিজিক্যাল পুশ বোতামযুক্ত কম-ক্ষমতার মাইক্রোকন্ট্রোলারের জন্য বিশেষভাবে নকশা করা। বোতাম চাপলে অভ্যন্তরীণ কাউন্টার বাড়ে এবং একটি LCD স্ক্রিনে ৬-সংখ্যার টোকেন প্রদর্শিত হয়।
Time-Based One-Time Password Algorithm। স্মার্টফোনের ব্যাপক প্রসারের সময় এটি নকশা করা হয়। সেলুলার NTP নেটওয়ার্ক সময় সিঙ্ক্রোনাইজেশন ব্যবহার করে TOTP ফিজিক্যাল বোতামের অবস্থার অমিল সংক্রান্ত জটিলতা চিরতরে দূর করেছে।
HOTP (RFC 4226) আর্কিটেকচার ও Dynamic Truncation বাইট মেকানিক্স
HOTP-এর মূল গাণিতিক সংজ্ঞা অত্যন্ত সংক্ষিপ্ত:
প্যারামিটার বিশ্লেষণ:
K: শেয়ার্ড সিমেট্রিক সিক্রেট কি (সাধারণত Base32 ডিকোড করা 160-বিট / 20-বাইট বাইনারি সিকোয়েন্স)।C: ৮-বাইট (64-বিট) বিগ-এন্ডিয়ান ইন্টিজার কাউন্টার।HMAC-SHA-1: কি-যুক্ত হ্যাশ মেসেজ অথেনটিকেশন কোড যা ২০-বাইট (160-বিট) ক্রিপ্টোগ্রাফিক ডাইজেস্ট তৈরি করে।
🔍 Dynamic Truncation (DT) যেভাবে ২০ বাইটকে ৬ সংখ্যায় রূপান্তরিত করে:
একটি HMAC-SHA1 ডাইজেস্টে ১৬০ বিট (২০ বাইট) থাকে। এর থেকে অভিন্ন ৬টি দশমিক সংখ্যা বের করতে RFC 4226-এর সেকশন ৫.৩-এ সংজ্ঞায়িত একটি সুনির্দিষ্ট ও কোলিশন-প্রতিরোধী নির্বাচন পদ্ধতি ব্যবহার করা হয়:
ধরা যাক সিক্রেট কি হলো ASCII "12345678901234567890" এবং কাউন্টার C = 0। এর ফলে প্রাপ্ত হেক্সাডেসিমেল HMAC-SHA1 ডাইজেস্ট দাঁড়ায়:
১. শেষ বাইটটি হলো 0x71। 0x71 & 0x0F = 0x01, সুতরাং Offset = 1।
২. ১ থেকে ৪ নম্বর বাইটগুলো হলো: 93 cf 18 50। MSB শূন্য করলে পাওয়া যায় 0x13cf1850, যা দশমিকে 332,339,280-এর সমান।
৩. 332339280 mod 1000000 = 339280। ফলে প্রাপ্ত ৬-সংখ্যার OTP হলো 339280!
TOTP (RFC 6238) বিবর্তন: টাইম-স্টেপের ম্যাজিক
HOTP-তে ক্লায়েন্টের কাউন্টার এবং সার্ভারের কাউন্টার সার্বক্ষণিক সিঙ্ক করে রাখতে হতো। সফটওয়্যার ডিভাইসে বোতাম চাপার সংখ্যা গণনার ক্ষেত্রে মানুষের অনিচ্ছাকৃত ভুলের সুযোগ থেকে যায়।
RFC 6238 কাউন্টার C-কে ইউনিক্স ইপক ঘড়ি থেকে সরাসরি প্রাপ্ত একটি স্বতন্ত্র টাইম-স্টেপ T দ্বারা প্রতিস্থাপন করেছে:
- CurrentUnixTime: ১৯৭০-০১-০১ ০০:০০:০০ UTC থেকে অতিবাহিত সেকেন্ড।
- T0: ইপক ইনিশিয়ালাইজেশন রেফারেন্স (আধুনিক সব সিস্টেমে ডিফল্ট ০)।
- X (টাইম-স্টেপ উইন্ডো): স্ট্যান্ডার্ড প্রস্তাবিত সময়সীমা ৩০ সেকেন্ড।
- ফ্লোর ফাংশন ⌊ ⌋: যেকোনো ৩০-সেকেন্ড উইন্ডোর ভেতরের টাইমস্ট্যাম্পের জন্য T অপরিবর্তিত থাকে। উদাহরণস্বরূপ, ইপক সেকেন্ড 1728211200 এবং 1728211229-এর মধ্যে T-এর মান হুবহু একই ৬৪-বিট পূর্ণসংখ্যা নির্দেশ করে।
বাইনারি সিরিয়ালাইজেশন: T গণনা করার পর এটিকে একটি ৮-বাইট বিগ-এন্ডিয়ান বাইনারি বাফারে প্যাক করা হয় (যা মেমোরি কাঠামোতে HOTP-এর কাউন্টার C-এর হুবহু অনুরূপ)। এর ফলে সমন্বিত সূত্রটি সংক্ষেপে দাঁড়ায়:
TOTP(K, Time) = HOTP(K, T)
এই গাণিতিক চমৎকারিত্বই ব্যাখ্যা করে কেন স্থায়ী স্টেট সিঙ্ক্রোনাইজেশন ছাড়াই প্রমাণীকরণকারী অ্যাপগুলো প্রতি ৩০ সেকেন্ড অন্তর সমন্বিতভাবে টোকেন পরিবর্তন করতে পারে।
HS[31] & 0x0F); SHA-512 (৬৪-বাইট ডাইজেস্ট)-এ অফসেট নেওয়া হয় ৬৩তম বাইট থেকে (HS[63] & 0x0F)। তবে বাণিজ্যিক ওয়েবসাইটের ৯৯.৯% ক্ষেত্রে (যেমন Google, Microsoft, GitHub, AWS) লিগ্যাসি মোবাইল ক্লায়েন্টের সামঞ্জস্যের স্বার্থে SHA-1-ই সর্বজনীন ডিফল্ট হিসেবে বহাল রয়েছে।
পাশাপাশি বিশদ তুলনামূলক ম্যাট্রিক্স (HOTP বনাম TOTP)
| তুলনামূলক দিক | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| ইনপুট চলক (Input Variable) | ইভেন্ট কাউন্টার C (ধারাবাহিকভাবে ক্রমবর্ধমান) | টাইম-স্টেপ T (৩০-সেকেন্ডের ইউনিক্স ইপক উইন্ডো) |
| টোকেনের মেয়াদ (Token Lifespan) | অনির্দিষ্টকাল (পরবর্তী লগইনে ব্যবহৃত না হওয়া পর্যন্ত বৈধ) | কঠোর ৩০ সেকেন্ড (স্বয়ংক্রিয়ভাবে বাতিল হয়) |
| সার্ভার আর্কিটেকচার | স্টেটফুল (প্রতি লগইনে ডেটাবেসে কাউন্টার রাইট প্রয়োজন) | স্টেটলেস (স্বাধীন NTP সময় যাচাইকরণ) |
| রিপ্লে আক্রমণের ঝুঁকি | মাঝারি (ব্যবহৃত না হওয়া পর্যন্ত আটকানো টোকেন বৈধ থাকে) | ন্যূনতম (বর্তমান উইন্ডোর অবশিষ্ট সেকেন্ডের মধ্যে সীমাবদ্ধ) |
| প্রধান ব্যর্থতার কারণ | কাউন্টার ডিসিঙ্ক্রোনাইজেশন (অসাবধানতাবশত বোতাম চাপা) | ক্লক ড্রিফট (ক্লায়েন্ট ডিভাইসের সময়ের অসঙ্গতি) |
| সমর্থিত ক্রিপ্টোগ্রাফিক হ্যাশ | শুধুমাত্র HMAC-SHA-1 | HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512 |
| শিল্পক্ষেত্রে গ্রহণযোগ্যতা | লিগ্যাসি ব্যাংকিং ফোব, বিশেষায়িত ফিজিক্যাল গেট | আধুনিক ওয়েব প্রমাণীকরণকারীর ৯৯.৯% |
ডিসিঙ্ক্রোনাইজেশন বনাম টাইম ড্রিফট: প্রযুক্তিগত সমাধান
বিতরণকৃত প্রোডাকশন পরিবেশে ক্লায়েন্ট ও সার্ভারের ঘড়ির মধ্যে সময়ের কিছুটা বিচ্যুতি হওয়া স্বাভাবিক। নির্ভরযোগ্যতা বজায় রাখতে ক্রিপ্টোগ্রাফাররা সুনির্দিষ্ট ক্ষতিপূরণমূলক উইন্ডো তৈরি করেছেন:
কোনো ব্যবহারকারী যদি লগইন না করে ভুলবশত পরপর ৫ বার টোকেন বোতাম চাপেন, তবে ক্লায়েন্ট কাউন্টার C+5-এ পৌঁছায়, অথচ সার্ভার C-তেই অপরিবর্তিত থাকে।
RFC 4226 নির্দেশ করে যে প্রমাণীকরণের সময় সার্ভার [C+1, C+s] পরিসীমা পর্যন্ত লুক-অ্যাহেড উইন্ডো গণনা করবে (সাধারণত s=20)। মিল পাওয়া গেলে সার্ভার সামনের মানে এগিয়ে যায় এবং অবিলম্বে কাউন্টার C সিঙ্ক করে নেয়।
নেটওয়ার্ক লেটেন্সি বা ক্লায়েন্ট ডিভাইসের ঘড়ির বিচ্যুতির কারণে (যেমন ফোনের ঘড়ি ১০ সেকেন্ড পিছিয়ে থাকলে), টোকেনটি সংলগ্ন টাইম-স্টেপে পৌঁছাতে পারে।
প্রোডাকশন সার্ভার ৩টি উইন্ডোর একটি অ্যারে মূল্যায়ন করে: [T-1, T, T+1], যা কার্যকরভাবে গ্রহণযোগ্যতার সময়সীমা ৯০ সেকেন্ড পর্যন্ত প্রসারিত করে।
সার্ভার যখন ব্যবহারকারীর পাঠানো কোডটির সাথে গণনা করা কোড মেলায়, তখন সাধারণ স্ট্রিং সমতা পরীক্ষা (যেমন userOtp === serverOtp) প্রথম অমিল অক্ষরেই যাচাইকরণ প্রক্রিয়া থামিয়ে দেয়। আক্রমণকারী মাইক্রোস্কোপিক নেটওয়ার্ক রেসপন্স টাইম পরিমাপ করে ধাপে ধাপে প্রতিটি সংখ্যা বের করে ফেলতে পারে। সাইড-চ্যানেল টাইমিং অ্যানালিসিস প্রতিহত করতে এন্টারপ্রাইজ ব্যাকএন্ডগুলো কনস্ট্যান্ট-টাইম সমতা তুলনা (যেমন Node.js-এ crypto.timingSafeEqual) কার্যকর করে।
কেন TOTP আধুনিক ইন্টারনেটকে জয় করেছে
ওয়েব জুড়ে HOTP-এর ওপর TOTP-এর চূড়ান্ত বিজয় মূলত তিনটি স্থাপত্যগত সুবিধার কারণে হয়েছে:
বিতরণকৃত মাল্টি-অঞ্চল মাইক্রোসার্ভিসে NTP-সিঙ্ক্রোনাইজড ঘড়ি সম্পন্ন যেকোনো সার্ভার ইনস্ট্যান্স কোনো কেন্দ্রীভূত ডেটাবেস কোয়েরি বা লক না করেই TOTP টোকেন স্বাধীনভাবে যাচাই করতে পারে।
স্মার্টফোনগুলো সেলুলার বেস স্টেশন এবং GPS-এর মাধ্যমে প্রতিনিয়ত তাদের সিস্টেম ঘড়ি ক্যালিব্রেট করে নেয়, যার ফলে ফিজিক্যাল হার্ডওয়্যার রক্ষণাবেক্ষণ ছাড়াই ক্লক ড্রিফট দূর হয়।
HOTP টোকেন ব্যবহৃত না হওয়া পর্যন্ত অনির্দিষ্টকালের জন্য কার্যকর থাকে। কিন্তু TOTP টোকেন ৩০ সেকেন্ডের মধ্যে বাতিল হয়ে যায়, যা আপসকৃত লগ এবং প্যাসিভ প্যাকেট ক্যাপচারের ঝুঁকি স্বয়ংক্রিয়ভাবে হ্রাস করে।
2FA-Tool-এ রিয়েল-টাইম TOTP গণনার অভিজ্ঞতা নিন
HMAC-SHA1 ডায়নামিক ট্রাঙ্কেশন ব্যবহারের মাধ্যমে আপনার Base32 সিক্রেট স্ট্রিং কীভাবে ডায়নামিক ৬-সংখ্যার কোডে রূপান্তরিত হয় তা দেখুন। আপনার ব্রাউজারে সম্পূর্ণ অফলাইনে।
📚 সম্পর্কিত নিরাপত্তা নির্দেশিকা
অফলাইন QR কোড এবং ক্লাউড সিঙ্ক ব্যবহার করে কীভাবে স্মার্টফোনে 2FA অ্যাকাউন্ট স্থানান্তর করবেন।
বাধ্যতামূলক নিয়ম, রিকভারি কোড সংরক্ষণ, SSH কি পারমিশন এবং অ্যাকাউন্ট উদ্ধার প্রক্রিয়া।
Google, Microsoft, Steam, Binance, Apple ও Discord অ্যাকাউন্টের অ্যাক্সেস পুনরুদ্ধারের উপায়।