2FA-Tool Logo
2FA-Tool.com ক্লায়েন্ট-সাইড নিরাপদ 2FA জেনারেটর
⏱️ ক্রিপ্টোগ্রাফি ও RFC প্রোটোকল ✓ IETF স্ট্যান্ডার্ড বিশ্লেষণ

TOTP বনাম HOTP: মৌলিক পার্থক্য, কার্যপ্রণালী এবং ক্রিপ্টোগ্রাফিক নিরাপত্তা

লাখো ডেভেলপার ও সিকিউরিটি ইঞ্জিনিয়ার প্রতিদিন ঘূর্ণায়মান ৬-সংখ্যার যাচাইকরণ কোড দেখেন, কিন্তু স্ক্রিনের আড়ালে কার্যকর মার্জিত গাণিতিক কাঠামো খুব কম লোকই বোঝেন। ২০০৫ সালের RFC 4226 (HOTP) ইভেন্ট-ভিত্তিক কাউন্টার থেকে শুরু করে ২০১১ সালের RFC 6238 (TOTP) নির্দিষ্ট টাইম-স্টেপ পর্যন্ত—এই গাইডে বাইট স্তরের Dynamic Truncation অ্যালগরিদম, কাউন্টার ডিসিঙ্ক দুর্বলতা, ক্লক ড্রিফট সহনশীলতা এবং কেন TOTP আধুনিক ওয়েবকে জয় করেছে তা বিশদভাবে আলোচনা করা হয়েছে।

2FA
2FA-Tool সিকিউরিটি টিম
আপডেট: অক্টোবর ২০২৬
আনুমানিক পড়ার সময়: ১৪ মিনিট (২,৬০০+ শব্দ)
RFC 6238 RFC 4226 Dynamic Truncation
💡 ক্রিপ্টোগ্রাফিক সারসংক্ষেপ (TL;DR)
  • মৌলিক ইনপুট পার্থক্য: HOTP একটি ক্রমবর্ধমান কাউন্টার C (monotonically increasing counter C) থেকে হ্যাশ গণনা করে, যেখানে TOTP কাউন্টার C-কে একটি ইপক টাইম-স্টেপ T (CurrentUnixTime / 30) দিয়ে প্রতিস্থাপন করে।
  • সরাসরি উত্তরাধিকার: গাণিতিকভাবে TOTP মূলত HOTP-এরই একটি বিশেষ রূপ: TOTP(K, Time) = HOTP(K, T)। উভয় অ্যালগরিদম হুবহু একই Dynamic Truncation ফাংশন ব্যবহার করে।
  • আর্কিটেকচারাল নির্ণায়ক উপাদান: HOTP হলো স্টেটফুল (প্রতিটি যাচাইকরণের সময় সার্ভারকে ডিস্কে কাউন্টার লক এবং সংরক্ষণ করতে হয়)। আর TOTP হলো স্টেটলেস, যা আধুনিক ক্লাউড মাইক্রোসার্ভিসগুলোকে কোনো কেন্দ্রীভূত ডেটাবেসে লেখার ঝামেলা ছাড়াই বিতরণকৃত লোড-ব্যালেন্সড ক্লাস্টারে টোকেন যাচাই করার সুবিধা দেয়।
01

ঐতিহাসিক পটভূমি: মালিকানাধীন হার্ডওয়্যার টোকেন থেকে উন্মুক্ত ওয়েব স্ট্যান্ডার্ড

২০০০-এর দশকের শুরুতে করপোরেট দ্বি-পদক্ষেপ প্রমাণীকরণে RSA SecurID-এর মতো মালিকানাধীন (proprietary) কি-ফোবগুলোর আধিপত্য ছিল। এই ব্যয়বহুল এবং আবদ্ধ ডিভাইসগুলোতে অভ্যন্তরীণ কোয়ার্টজ ক্রিস্টাল থাকত, যা এন্টারপ্রাইজ সার্ভারের সাথে সিঙ্ক করা থাকত। কোনো সংস্থা যদি হাজার হাজার কর্মীকে মাল্টি-ফ্যাক্টর নিরাপত্তা দিতে চাইত, তবে হার্ডওয়্যার সংগ্রহ এবং মালিকানাধীন লাইসেন্সিং খরচ ছিল আকাশচুম্বী।

মালিকানাধীন বিক্রেতাদের ওপর থেকে এই নির্ভরতা দূর করতে শিল্পের নেতৃস্থানীয় প্রতিষ্ঠানগুলো OATH (Initiative for Open Authentication) কনসোর্টিয়াম গঠন করে, যাতে উন্মুক্ত এবং রয়্যালটি-মুক্ত IETF স্ট্যান্ডার্ড তৈরি করা যায় যা যেকোনো সফটওয়্যার ইঞ্জিনিয়ার স্বাধীনভাবে পরীক্ষা, বাস্তবায়ন এবং অডিট করতে পারেন:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm। ফিজিক্যাল পুশ বোতামযুক্ত কম-ক্ষমতার মাইক্রোকন্ট্রোলারের জন্য বিশেষভাবে নকশা করা। বোতাম চাপলে অভ্যন্তরীণ কাউন্টার বাড়ে এবং একটি LCD স্ক্রিনে ৬-সংখ্যার টোকেন প্রদর্শিত হয়।

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm। স্মার্টফোনের ব্যাপক প্রসারের সময় এটি নকশা করা হয়। সেলুলার NTP নেটওয়ার্ক সময় সিঙ্ক্রোনাইজেশন ব্যবহার করে TOTP ফিজিক্যাল বোতামের অবস্থার অমিল সংক্রান্ত জটিলতা চিরতরে দূর করেছে।

02

HOTP (RFC 4226) আর্কিটেকচার ও Dynamic Truncation বাইট মেকানিক্স

HOTP-এর মূল গাণিতিক সংজ্ঞা অত্যন্ত সংক্ষিপ্ত:

HOTP(K, C) = Truncate(HMAC-SHA-1(K, C)) mod 10DigitCount

প্যারামিটার বিশ্লেষণ:

  • K: শেয়ার্ড সিমেট্রিক সিক্রেট কি (সাধারণত Base32 ডিকোড করা 160-বিট / 20-বাইট বাইনারি সিকোয়েন্স)।
  • C: ৮-বাইট (64-বিট) বিগ-এন্ডিয়ান ইন্টিজার কাউন্টার।
  • HMAC-SHA-1: কি-যুক্ত হ্যাশ মেসেজ অথেনটিকেশন কোড যা ২০-বাইট (160-বিট) ক্রিপ্টোগ্রাফিক ডাইজেস্ট তৈরি করে।

🔍 Dynamic Truncation (DT) যেভাবে ২০ বাইটকে ৬ সংখ্যায় রূপান্তরিত করে:

একটি HMAC-SHA1 ডাইজেস্টে ১৬০ বিট (২০ বাইট) থাকে। এর থেকে অভিন্ন ৬টি দশমিক সংখ্যা বের করতে RFC 4226-এর সেকশন ৫.৩-এ সংজ্ঞায়িত একটি সুনির্দিষ্ট ও কোলিশন-প্রতিরোধী নির্বাচন পদ্ধতি ব্যবহার করা হয়:

// ধাপ ১: ডায়নামিক অফসেট গণনা
Offset = HS[19] & 0x0F
২০-বাইট ডাইজেস্টের শেষ বাইটটি (ইন্ডেক্স ১৯) নিন। 0x0F দিয়ে মাস্কিং করলে নিচের ৪টি বিট আলাদা হয়, যা ০ থেকে ১৫ (0x0 থেকে 0xF)-এর মধ্যে একটি পূর্ণসংখ্যা দেয়। এটি নিশ্চিত করে যে পরবর্তী ৪-বাইট নিষ্কাশন কখনই ২০-বাইটের বাফার অতিক্রম করবে না (কারণ ১৫ + ৪ = ১৯)।
// ধাপ ২: মাস্কিংসহ পরপর ৪টি বাইট নিষ্কাশন
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Offset থেকে শুরু করে ৪টি বাইট বের করুন। বিভিন্ন CPU আর্কিটেকচারে সাইনড ইন্টিজার ওভারফ্লো এড়াতে 0x7F মাস্ক দিয়ে মোস্ট সিগনিফিক্যান্ট বিটটি (MSB) শূন্য করা হয় (যা একটি নিশ্চিত পজিটিভ ৩১-বিট পূর্ণসংখ্যা দেয়)।
// ধাপ ৩: চূড়ান্ত সংখ্যার জন্য মডুলো পাটিগণিত
OTP = P mod 106 = P mod 1000000
১,০০০,০০০ দিয়ে মডুলো করলে শেষ ৬টি দশমিক সংখ্যা পাওয়া যায়, প্রয়োজনে শুরুতে শূন্য (leading zero) যোগ করা হয় (যেমন: ৭৪৮ হয়ে যায় "000748")।
🧪 RFC 4226 পরিশিষ্ট D থেকে বাস্তব টেস্ট ভেক্টর:

ধরা যাক সিক্রেট কি হলো ASCII "12345678901234567890" এবং কাউন্টার C = 0। এর ফলে প্রাপ্ত হেক্সাডেসিমেল HMAC-SHA1 ডাইজেস্ট দাঁড়ায়:

cc 93 cf 18 50 8d 94 93 4c 64 b6 6d 8b fb 87 fb 23 cb 4b 71

১. শেষ বাইটটি হলো 0x71। 0x71 & 0x0F = 0x01, সুতরাং Offset = 1।
২. ১ থেকে ৪ নম্বর বাইটগুলো হলো: 93 cf 18 50। MSB শূন্য করলে পাওয়া যায় 0x13cf1850, যা দশমিকে 332,339,280-এর সমান।
৩. 332339280 mod 1000000 = 339280। ফলে প্রাপ্ত ৬-সংখ্যার OTP হলো 339280!

03

TOTP (RFC 6238) বিবর্তন: টাইম-স্টেপের ম্যাজিক

HOTP-তে ক্লায়েন্টের কাউন্টার এবং সার্ভারের কাউন্টার সার্বক্ষণিক সিঙ্ক করে রাখতে হতো। সফটওয়্যার ডিভাইসে বোতাম চাপার সংখ্যা গণনার ক্ষেত্রে মানুষের অনিচ্ছাকৃত ভুলের সুযোগ থেকে যায়।

RFC 6238 কাউন্টার C-কে ইউনিক্স ইপক ঘড়ি থেকে সরাসরি প্রাপ্ত একটি স্বতন্ত্র টাইম-স্টেপ T দ্বারা প্রতিস্থাপন করেছে:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: ১৯৭০-০১-০১ ০০:০০:০০ UTC থেকে অতিবাহিত সেকেন্ড।
  • T0: ইপক ইনিশিয়ালাইজেশন রেফারেন্স (আধুনিক সব সিস্টেমে ডিফল্ট ০)।
  • X (টাইম-স্টেপ উইন্ডো): স্ট্যান্ডার্ড প্রস্তাবিত সময়সীমা ৩০ সেকেন্ড।
  • ফ্লোর ফাংশন ⌊ ⌋: যেকোনো ৩০-সেকেন্ড উইন্ডোর ভেতরের টাইমস্ট্যাম্পের জন্য T অপরিবর্তিত থাকে। উদাহরণস্বরূপ, ইপক সেকেন্ড 1728211200 এবং 1728211229-এর মধ্যে T-এর মান হুবহু একই ৬৪-বিট পূর্ণসংখ্যা নির্দেশ করে।

বাইনারি সিরিয়ালাইজেশন: T গণনা করার পর এটিকে একটি ৮-বাইট বিগ-এন্ডিয়ান বাইনারি বাফারে প্যাক করা হয় (যা মেমোরি কাঠামোতে HOTP-এর কাউন্টার C-এর হুবহু অনুরূপ)। এর ফলে সমন্বিত সূত্রটি সংক্ষেপে দাঁড়ায়:
TOTP(K, Time) = HOTP(K, T) এই গাণিতিক চমৎকারিত্বই ব্যাখ্যা করে কেন স্থায়ী স্টেট সিঙ্ক্রোনাইজেশন ছাড়াই প্রমাণীকরণকারী অ্যাপগুলো প্রতি ৩০ সেকেন্ড অন্তর সমন্বিতভাবে টোকেন পরিবর্তন করতে পারে।

SHA-256 এবং SHA-512-এর জন্য RFC 6238 সমর্থন: RFC 4226 কঠোরভাবে HMAC-SHA-1 সংজ্ঞায়িত করলেও RFC 6238 HMAC-SHA-256 এবং HMAC-SHA-512-এর সমর্থন যুক্ত করেছে। SHA-256 (৩২-বাইট ডাইজেস্ট)-এ অফসেট নেওয়া হয় ৩১তম বাইট থেকে (HS[31] & 0x0F); SHA-512 (৬৪-বাইট ডাইজেস্ট)-এ অফসেট নেওয়া হয় ৬৩তম বাইট থেকে (HS[63] & 0x0F)। তবে বাণিজ্যিক ওয়েবসাইটের ৯৯.৯% ক্ষেত্রে (যেমন Google, Microsoft, GitHub, AWS) লিগ্যাসি মোবাইল ক্লায়েন্টের সামঞ্জস্যের স্বার্থে SHA-1-ই সর্বজনীন ডিফল্ট হিসেবে বহাল রয়েছে।
04

পাশাপাশি বিশদ তুলনামূলক ম্যাট্রিক্স (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
শিল্পক্ষেত্রে গ্রহণযোগ্যতা লিগ্যাসি ব্যাংকিং ফোব, বিশেষায়িত ফিজিক্যাল গেট আধুনিক ওয়েব প্রমাণীকরণকারীর ৯৯.৯%
05

ডিসিঙ্ক্রোনাইজেশন বনাম টাইম ড্রিফট: প্রযুক্তিগত সমাধান

বিতরণকৃত প্রোডাকশন পরিবেশে ক্লায়েন্ট ও সার্ভারের ঘড়ির মধ্যে সময়ের কিছুটা বিচ্যুতি হওয়া স্বাভাবিক। নির্ভরযোগ্যতা বজায় রাখতে ক্রিপ্টোগ্রাফাররা সুনির্দিষ্ট ক্ষতিপূরণমূলক উইন্ডো তৈরি করেছেন:

⚙️ HOTP সমাধান: লুক-অ্যাহেড যাচাইকরণ উইন্ডো (s)

কোনো ব্যবহারকারী যদি লগইন না করে ভুলবশত পরপর ৫ বার টোকেন বোতাম চাপেন, তবে ক্লায়েন্ট কাউন্টার C+5-এ পৌঁছায়, অথচ সার্ভার C-তেই অপরিবর্তিত থাকে।
RFC 4226 নির্দেশ করে যে প্রমাণীকরণের সময় সার্ভার [C+1, C+s] পরিসীমা পর্যন্ত লুক-অ্যাহেড উইন্ডো গণনা করবে (সাধারণত s=20)। মিল পাওয়া গেলে সার্ভার সামনের মানে এগিয়ে যায় এবং অবিলম্বে কাউন্টার C সিঙ্ক করে নেয়।

⏱️ TOTP সমাধান: টাইম স্কিউ সহনশীলতা (±১ উইন্ডো)

নেটওয়ার্ক লেটেন্সি বা ক্লায়েন্ট ডিভাইসের ঘড়ির বিচ্যুতির কারণে (যেমন ফোনের ঘড়ি ১০ সেকেন্ড পিছিয়ে থাকলে), টোকেনটি সংলগ্ন টাইম-স্টেপে পৌঁছাতে পারে।
প্রোডাকশন সার্ভার ৩টি উইন্ডোর একটি অ্যারে মূল্যায়ন করে: [T-1, T, T+1], যা কার্যকরভাবে গ্রহণযোগ্যতার সময়সীমা ৯০ সেকেন্ড পর্যন্ত প্রসারিত করে।

বাধ্যতামূলক অ্যান্টি-রিপ্লে নিয়ম: ৯০-সেকেন্ডের স্কিউ উইন্ডোর মধ্যে রিপ্লে আক্রমণ রোধ করতে সার্ভারগুলোকে অবশ্যই ব্যবহৃত টোকেনগুলো মেমোরিতে (যেমন Redis) ৯০ সেকেন্ডের জন্য ক্যাশ ও লক করে রাখতে হবে, যাতে দ্বিতীয়বার জমা দিলে তা সরাসরি বাতিল হয়।
🛡️ কনস্ট্যান্ট-টাইম স্ট্রিং তুলনা (সাইড-চ্যানেল টাইমিং অ্যাটাক প্রতিরক্ষা):

সার্ভার যখন ব্যবহারকারীর পাঠানো কোডটির সাথে গণনা করা কোড মেলায়, তখন সাধারণ স্ট্রিং সমতা পরীক্ষা (যেমন userOtp === serverOtp) প্রথম অমিল অক্ষরেই যাচাইকরণ প্রক্রিয়া থামিয়ে দেয়। আক্রমণকারী মাইক্রোস্কোপিক নেটওয়ার্ক রেসপন্স টাইম পরিমাপ করে ধাপে ধাপে প্রতিটি সংখ্যা বের করে ফেলতে পারে। সাইড-চ্যানেল টাইমিং অ্যানালিসিস প্রতিহত করতে এন্টারপ্রাইজ ব্যাকএন্ডগুলো কনস্ট্যান্ট-টাইম সমতা তুলনা (যেমন Node.js-এ crypto.timingSafeEqual) কার্যকর করে।

06

কেন TOTP আধুনিক ইন্টারনেটকে জয় করেছে

ওয়েব জুড়ে HOTP-এর ওপর TOTP-এর চূড়ান্ত বিজয় মূলত তিনটি স্থাপত্যগত সুবিধার কারণে হয়েছে:

☁️ স্টেটলেস ক্লাউড স্কেলাবিলিটি

বিতরণকৃত মাল্টি-অঞ্চল মাইক্রোসার্ভিসে NTP-সিঙ্ক্রোনাইজড ঘড়ি সম্পন্ন যেকোনো সার্ভার ইনস্ট্যান্স কোনো কেন্দ্রীভূত ডেটাবেস কোয়েরি বা লক না করেই TOTP টোকেন স্বাধীনভাবে যাচাই করতে পারে।

📱 মোবাইল ইকোসিস্টেমের সুবিধা

স্মার্টফোনগুলো সেলুলার বেস স্টেশন এবং GPS-এর মাধ্যমে প্রতিনিয়ত তাদের সিস্টেম ঘড়ি ক্যালিব্রেট করে নেয়, যার ফলে ফিজিক্যাল হার্ডওয়্যার রক্ষণাবেক্ষণ ছাড়াই ক্লক ড্রিফট দূর হয়।

🛡️ সংক্ষিপ্ত ৩০-সেকেন্ডের আক্রমণের সুযোগ

HOTP টোকেন ব্যবহৃত না হওয়া পর্যন্ত অনির্দিষ্টকালের জন্য কার্যকর থাকে। কিন্তু TOTP টোকেন ৩০ সেকেন্ডের মধ্যে বাতিল হয়ে যায়, যা আপসকৃত লগ এবং প্যাসিভ প্যাকেট ক্যাপচারের ঝুঁকি স্বয়ংক্রিয়ভাবে হ্রাস করে।

🧮 পিওর ক্লায়েন্ট-সাইড RFC 6238 ইঞ্জিন

2FA-Tool-এ রিয়েল-টাইম TOTP গণনার অভিজ্ঞতা নিন

HMAC-SHA1 ডায়নামিক ট্রাঙ্কেশন ব্যবহারের মাধ্যমে আপনার Base32 সিক্রেট স্ট্রিং কীভাবে ডায়নামিক ৬-সংখ্যার কোডে রূপান্তরিত হয় তা দেখুন। আপনার ব্রাউজারে সম্পূর্ণ অফলাইনে।

অনলাইন জেনারেটর খুলুন