2-Factor Authenticator এপগুলো কিভাবে কাজ করে?

Photo by PhotoMIX Ltd. from Pexels

বরাবরের মত সেদিনও একটা অনলাইন সার্ভিসে লগইন করার সময় ইমেইল, পাসওয়ার্ড দেয়ার পর সেটার 2FA(2-Factor Authentication) চালু থাকায় OTP (One Time Password) চেয়ে বসলো। তো মোবাইলে থাকা Google Authenticator অন করে সেখান থেকে OTP টা দেখে নিতে গিয়ে খেয়াল করলাম আমার মোবাইলে নেট চালু নেই। অথচ দিব্যি আমি OTP জেনারেট করে নিয়ে সেটা সার্ভিসের ফর্মে এন্ট্রি দিয়ে লগইন করতে পারছি। সাধারণভাবে আপনারা হয়তো জানেন যে SMS এ অনেক সময় কিছু কিছু সার্ভিস OTP পাঠায়। তো আমি সেই ধারণাতেই মনে করতাম যে, Google Authenticator এর মত 2FA Authenticator এপগুলোও সম্ভবত রিয়েল টাইমে সার্ভার থেকে একটা OTP রিসিভ করে আমাকে দেখায়। কিন্তু এ দেখি আজব কারবার!
নেট না থাকলে এপ OTP পায় কোথায়?
আবার ও যদি নিজের মন মত OTP জেনারেট করে দেয়, তাহলে সার্ভার আবার সেটাকে ভ্যালিডেট করে কিভাবে?

এ কি জাদু?

না ভাই, জাদু নহে। এই অত্যাশ্চর্য ব্যাপারের পেছনের গল্প জানতেই আজকের এই আলোচনা। চলুন শুরু করা যাক।

প্রথমেই একটু বলে নেই 2FA বা 2-Factor Authentication নিয়ে। আমরা সাধারণত যেই Authentication প্রসেসগুলো দেখি, যেমন ইমেইল, পাসওয়ার্ড দিয়ে লগইন বা সোশ্যাল লগইন যেমন (ফেসবুক, গুগল দিয়ে লগইন) এগুলো মূলত 1 Factor Authentication। অর্থাৎ আমি ‘জানি’ এরকম একটা বিষয়ের উপরই Authentication প্রসেস নির্ভর করে। কিন্তু সিকিউরিটি আরেকটু জোরদার করার জন্য এর সাথে আরও এক ধাপ বাড়ানো হয়। আপনি যদি ATM বা এই রকম কার্ড দিয়ে ব্যাংকের ট্রান্সেকশন করে থাকেন তাহলে দেখে থাকবেন যে, আপনার Authentication এর জন্য দুইটা জিনিস লাগে। একটা হল আপনার ‘কার্ড’, আরেকটা হলো ‘পিন/পাসওয়ার্ড’। তারমানে বুঝতেই পারছেন এখানে ২ টা ফ্যাক্টর দিয়ে আপনার Authentication নির্ধারণ করা হচ্ছে, একটা হচ্ছে- ‘Something You Know’ অর্থাৎ ‘পিন’, আরেকটা হলো ‘Something You Have/Possess’ অর্থাৎ ‘কার্ড’। তারমানে কেউ যদি আপনার কার্ড হাতিয়েও নেয় তাতে করে কিন্তু আপনার একাউন্টে সে কিছুই করতে পারবে না। আবার আপনার পিনটা কোনোভাবে সোশ্যাল ইঞ্জিনিয়ারিং করে জেনে ফেললেও যদি না কার্ড পায় তাহলেও আপনার একাউন্ট সিকিউর।

সাধারণত অনেকেই তাঁদের একাউন্টে খুব দূর্বল পাসওয়ার্ড ব্যবহার করে থাকেন, কিংবা কখনো কোন অনলাইন সার্ভিসের ডাটাবেজ হ্যাক হলে সেখান থেকে ইউজারদের ডাটাবেজ চুরি যাওয়ার চান্স থাকে। যেহেতু অনেকেই একই পাসওয়ার্ড একাধিক সার্ভিসে ব্যবহার করে থাকেন, তাই কোন একটা সার্ভিস কম্প্রোমাইজ হলে অন্যান্য সার্ভিসেও ঐ ইউজারের একাউন্ট ইন্সিকিউর হয়ে পড়ে। এক্ষেত্রে 2FA কিছুটা হলেও বাড়তি নিরাপত্তা দিতে পারে।
এই ফাঁকে বলে রাখি, অনেকে ‘পিন’ নাম্বার ভুলে যাবে দেখে বুদ্ধি করে সেটা ATM কার্ডের উপরেই লিখে রাখে। বুঝতেই পারছেন, সেই কার্ড খোয়া গেলে ব্যাপারটা কি দাঁড়াবে?

যাই হোক, 2FA নিয়ে এই হলো মোদ্দাকথা। আসল কথায় আসি এবার।

প্রথম যখন আপনি আপনার মোবাইলে Authenticator এপটা ইন্সটল করে কোনো একটা সার্ভিসে 2FA সচল করতে যাবেন, তখন সার্ভিস থেকে আপনাকে একটা টোকেন দিবে বা একটা QR কোড স্ক্যান করতে বলবে। এটা হলো ইনিশিয়ালাইজেশন প্রসেস, যেখানে সার্ভার Authenticator এপের সাথে একটা সিক্রেট শেয়ার করে এবং নিজের কাছেও সেই সিক্রেটটা রেখে দেয়। পরবর্তীতে OTP জেনারেট করতে গেলে এই সিক্রেটটা কাজে লাগে। এখন ইনিশিয়ালাইজেশন হয়ে যাওয়ার পর মূলত ২ ভাবে 2FA Authenticator এপগুলো OTP জেনারেট করে। একটা হলো HOTP, আরেকটা হলো TOTP.

HOTP (HMAC-based One-time Password):

এই সিস্টেমে ইনিশিয়ালাইজেশন স্টেপে সিক্রেটের সাথে সাথে একটা Counter ও সার্ভার এপের সাথে শেয়ার করে। মনে করি এই Counter টা ১। পরবর্তীতে যখনই আপনি এপ ওপেন করেন টোকেন জেনারেট করবেন তখন secret আর Counter মিলে একটা Hash জেনারেট করা হয় এবং সেখান থেকেই একটা ফিক্সড ডিজিটের (সাধারণত ৬-১০ ডিজিট) OTP পাওয়া যায়। এই OTP জেনারেশনের পুরো প্রসেসটাই কিন্তু এপের মধ্যেই হয়। এই প্রসেসের মাঝখানে সার্ভারের সাথে কোনো কমিউনিকেশনের দরকার পড়ে না। এখন আপনি যখন এই OTP টা যেই সার্ভিসে লগইন করবেন সেখানে দেন, তখন সার্ভারও এপের মত সেইম একই প্রসেস ফলো করে OTP জেনারেট করে এবং মিলিয়ে দেখে আপনার দেয়া OTP টা আর সার্ভারেরটা মেলে কিনা। যেহেতু সার্ভারের কাছেও সেইম টোকেন এবং Counter টা আছে, এবং একই এলগোরিদম দুই জায়গাতেই ব্যবহার হচ্ছে, সুতরাং দুইটা OTP একই হওয়ার কথা, তাই না? এইটাই হচ্ছে আসল কাহিনী যার কারণে সার্ভার আর এপের মধ্যে OTP জেনারেশনের সময় কমিউনিকেশনের দরকার পড়ে না। যদিও এখানে ছোট্ট একটু ঝামেলার ব্যাপার আছে। প্রতিবার আপনি যখন এপে OTP জেনারেট করছেন, এপ কিন্তু তার Counter টাকে increment করে দিচ্ছে। একইভাবে সার্ভারেও যখন একটা OTP ম্যাচ করানো হয় তখন সার্ভারও তার Counter বাড়িয়ে দেয়, নাহলে পরেরবার OTP তো মিলবে না। কিন্তু ঝামেলাটা হলো মনে করেন, আপনি এপে একবার OTP জেনারেট করলেন, কিন্তু সেই OTP টা সার্ভারে দিলেন না, তাহলে এপের কাউন্টার তো বেড়ে গেলো, পরেরবার যখন আবার এপের OTP জেনারেট হবে, তার কাউন্টার আর সার্ভারের কাউন্টার তো মিলবে না। ঝামেলাটা বোঝা গেছে?
এটার জন্য সার্ভার একটু বুদ্ধি খাটিয়ে যেটা করে তা হলো, আপনার দেয়া OTP টা যদি না মেলে, তাহলে সে তার Counter বাড়িয়ে বাড়িয়ে OTP জেনারেট করে ম্যাচ করার চেস্টা করে, যাতে করে মাঝখানে আপনি যেই OTP গুলো ব্যবহার করেননি তার কারণে বেড়ে যাওয়া Counter এর ঝামেলাটা এড়ানো যায়। যদিও এটা একটা নির্দিস্ট লিমিট পর্যন্ত চেক করা হয়, হয়তো ১০টা বা ২০টা। এমন না যে সে বাড়িয়ে বাড়িয়ে চেক করে যেতেই থাকবে। আরেকটা ব্যাপার হয় যে, মাঝে মাঝেই সার্ভার চেস্টা করে আপনার এপকে টোকা দিয়ে তার কারেন্ট Counter কত সেটা জেনে নিয়ে নিজেদের মধ্যে synchronization ঠিক রাখতে।

TOTP (Time-based One-time Password):

TOTP তেও HOTP এর মতই একই প্রসেস মেইন্টেইন করা হয়, পার্থক্য কেবল এখানে Counter টা হয় Current Time, অর্থাৎ Secret আর Current Unix Time মিলিয়ে OTP জেনারেট করা হয়। আপনি যদি বুদ্ধিমান হয়ে থাকেন আমার মত(!) তাহলে এই জায়গায় এসে আপনি হয়তো ভাবছেন, “আচ্ছা, আমি এপে যখন OTP জেনারেট করবো, তার পরে গিয়ে সার্ভারে চেক করতে গেলে OTP জেনারেট হবে ভিন্ন সময়ে, সুতরাং দুইটার টাইম তো একদম হুবহু মিলবে না, তাহলে ক্যামনে কি?”
জী ভাই, আপনি একেবারে ঠিক ধরেছেন। আপনাকে দিয়েই হবে। আপনার মত মনোযোগী পাঠকই তো খুঁজছিলাম। :D

আপনি যেই ঝামেলাটার কথা চিন্তা করছেন, এই ঝামেলাটা দূর করার জন্যই TOTP জেনারেটের সময় সাধারণত 30 সেকেন্ড বা 60 সেকেন্ডের একেকটা ফ্রেমে OTP জেনারেট করা হয়। আরেকটু সহজ করে বলি। TOTP তে OTP জেনারেট করার সহজ ফরমুলা অনেকটা এরকমঃ

Time Counter = floor(Current Time since Unix Epoch / 30)

এখন তারমানে Current Time যদি হয় 1556293816 তাহলে একে 30 দিয়ে ভাগ করে ম্যাথম্যাটিক্যাল Floor করলে যেই Counter আমরা পাবো, 10 সেকেন্ড পরেও (1556293826) আমরা একই Counter পাবো। তারমানে প্রতি ৩০ সেকেন্ড ডিফেরেন্সে Counter একই হবে। সুতরাং আপনি এপে OTP জেনারেট করার কিছুক্ষণ পরেও যদি সার্ভারে সেটা ভ্যালিডেট করার জন্য দেন, তাতেও প্রব্লেম নেই। এ কারণেই TOTP ভিত্তিক Authenticator এপে খেয়াল করলে দেখবেন যে OTP জেনারেট হওয়ার পরে একটা ঘড়ির মত ঘুরতে থাকে আর কিছুক্ষন পরেই আগের OTP চেঞ্জ হয়ে নতুন OTP দেখায়।
এই ফাঁকে একটা বিখ্যাত কৌতুক আপনাদের আবার একটু শুনাই।
এক ওয়াজ মাহফিলে হুজুর বলতেছিলেন, যে একটা খুব অলৌকিক গাছ আছে, যেটার পাতা মাটিতে পড়লে বাঘ হয়ে যায়, আর পানিতে পড়লে কুমির। এটা শুনে স্রোতাদের মাঝখান থেকে নোয়াখালীর এক লোক দাঁড়িয়ে বললো, ‘হুজুর, গাছের হাতা যদি অর্ধেক মাডিত হড়ে আর অর্ধেক হানিত হড়ে, তাইলে কি অইবো?’
যাই হোক, আমার বাড়িও যেহেতু নোয়াখালী, এ কারণে আমিও TOTP এর প্রসেসটা দেখার পর ভাবতেছিলাম, আচ্ছা, যদি আমার Current Time হয় 1556293829 আর মাত্র ২ সেকেন্ড পরেই আমি সার্ভারে আমার OTP দেই ভ্যালিডেট করার জন্য তাহলেই তো সার্ভার এটাকে ইনভ্যালিড দেখাবে কারণ মাত্র এই ২ সেকেন্ডের ব্যবধানেই তো আমার আর সার্ভারের 30 সেকেন্ড ফ্রেম চেঞ্জ হয়ে গেছে। ওই মাঝখানে পড়ার মত ব্যাপার আর কি, হে হে।
যাই হোক, যারা Authenticator এপ বানাইছে তারা এত বোকা না। তারা এই জন্য করে কি, ±1 টাইম ফ্রেমে ম্যাচ করে, অর্থাৎ আগের 30 সেকেন্ড ফ্রেমে পড়লে বা পরের 30 সেকেন্ড ফ্রেমে পড়লে OTP কি হবে সেটাও জেনারেট করে ম্যাচ করার চেস্টা করে। সুতরাং, নো চিন্তা, ডু OTP.

যাই হোক, অনেক কথা হলো। আশা করি, Authenticator এপগুলো সার্ভারের সাথে রিয়েল টাইম কমিউনিকেট না করেও বা অনলাইনে না থাকলেও কিভাবে কাজ করে সেটা বোঝাতে পেরেছি। তারপরও কোনো প্রশ্ন থাকলে কমেন্টে জানাতে পারেন।
আজ এ পর্যন্তই।

--

--

Ahmed shamim hassan
প্রোগ্রামিং পাতা

Curious mind. Software Engineer. Polyglot programmer. Avid learner. Average person.