আপনি কি চেয়েছেন আপনার ব্যয়বহুল ইন্টারনেট বিল ফেলে দিয়ে প্রতিবেশীর অনসিকিউয়ার 와ইফাই ব্যবহার করুন? একমাত্র বাধা ছিল Honeybadger-এর সিঙ্গল-ফ্যাক্টর অথ ফ্লো? ভালো খবর আছে আপনার জন্য।
ঘোষণা: টু-ফ্যাক্টর অথেন্টিকেশন (2FA)
মজাক পাশে, আমরা সিকিউরিটি খুব সিরিয়াসলি নিই। আমরা উত্সাহিত যে আমরা একটি গুরুত্বপূর্ণ টুল প্রদান করতে পারছি যাতে আমাদের ইউজাররা এবং তাদের ডেটা আরও সিকিউয়ার থাকে।
আমি শুধু 2FA কীভাবে এনাবল করতে হয় সেটি বোঝাতে পারতাম, কিন্তু এতে কী মজা? কীভাবে আমরা ক্রিপ্টোগ্রাফির বিলাসিত বিশ্বে একটি হালকা দৃষ্টি নেওয়া যাক এবং বুঝি 2FA কীভাবে কাজ করে।
মজা আপনার জিনিস না হলে, আপনি সরাসরি "How to enable" সেকশনে যেতে পারেন, আমার ফিলিংস হার্ট হবে না।
⚠️ সতর্কতা: নিচে কিছু থিওরি আছে
অনেক 2FA ইমপ্লিমেন্টেশন একটি অ্যালগরিদমের ওপর বিল্ট থাকে যাকে Time-Based One-Time Password (TOTP) বলা হয়। জিবে খুব স্মূথলি স্লাইড করে।
One-Time (এক-বারের)?
হ্যাঁ, এই মেথডের সৌন্দর্য হলো আপনি একই "পাসওয়ার্ড" প্রতিবার লগইন করার সময় ট্রান্সমিট করছেন না। একটি অথেন্টিকেটর অ্যাপ্লিকেশন ব্যবহার করে, একটি এক-বারের "পাসওয়ার্ড" জেনারেট হয় এবং সেটি ছোট সময় (সাধারণত ৩০ সেকেন্ড) জন্য ভ্যালিড থাকে, যা ম্যালকম-ইন-দ-মিডেল আট্যাকর ইফেক্টিভনেস খুব কমিয়ে দেয়।
যদিও কিছু কমপ্লিকেটেড বিটস আছে, ওভারঅল ইমপ্লিমেন্টেশন نسبيত সিম্পল।
দ্যা সিক্রেট (গুপ্ত কী)
TOTP-এর সম্পর্কে বুঝতে একটি কী পয়েন্ট হচ্ছে সার্ভার (ভেরিফায়ার) এবং অথেন্টিকেটর (প্রুভার)-এর মধ্যে একটি শেয়ার্ড সিক্রেট থাকতে হবে। এটি আসল "পাসওয়ার্ড", তবে এটি শুধু একবার ট্রান্সমিট হয় (তাই কি এটি এক-বারেরও?)!
সিক্রেট কনসিউম করার রিকমেন্ডেড উপায় হলো QR কোড। আপনি যখন QR কোড স্ক্যান করবেন আপনার স্মার্টফোনে, সিক্রেটটি একটি স্ট্যান্ডার্ড URI-তে এনকোডেড থাকে যেটি এরকম দেখায়:
otpauth://totp/Honeybadger.io:inigo@honeybadger.io?secret=base32-secret-key
QR কোড প্রদান করার কিছু সুবিধা (প্লেইনটেক্সট সিক্রেট এক্সপোজ করার বদলে):
- ৩২ ক্যারেক্টার কোড টাইপ করার জন্য কাদের টাইম আছে?
- আপনার অথেন্টিকেটর অ্যাপ আপনার এক-বারের পাসওয়ার্ডের জন্য হেল্পফুল লেবেল দিতে পারে (URI-তে ইমেইল এবং ইস্যুয়ার রেফারেন্স করে)। এটি স্পেশালি ইউজফুল যখন আপনি একাধিক সার্ভিসে 2FA ব্যবহার করেন।
- একটি ভালো কারণ QR কোড ব্যবহার করার জন্য!
otpauth স্কিমের কিছু এডিশনাল (প্রায় উপেক্ষিত) প্যারামিটার আছে, যা আপনি এখানে দেখতে পারেন।
MAC এবং আমি
সিক্রেটগুলো একবার অগ্রি হলে 🤝, আপনাকে (কোনো সময়) একটি One-Time Password প্রদান করতে বলা হবে। এখান থেকে জিনিসগুলো রিয়েল হয়ে যায়।
TOTP একটি আরেকটি অ্যালগরিদমের ওপর বিল্ট: HMAC-Based One-Time Password (HOTP), যা নিজে Hash-based Message Authentication Code (HMAC)-এর ওপর বেসড। এটি একটা বড় ক্রিপ্টো পিয়াজ।
TOTP এবং HOTP মূলত вариেশন যা মেসেজ হ্যাশ হবে। HMAC-এ আসলে ম্যাজিক হয়। HMAC একটি ডাইজেস্ট প্রোডিউস করে, যা কিছু ভ্যালু হ্যাশিং অ্যালগরিদম দিয়ে রান করালে আউটপুট হিসেবে আসে। চলুন Ruby কোডে একশন দেখি:
OpenSSL::HMAC.digest("SHA1", "my-secret-key", "the-earth-is-flat")
=> "R\xABp\xCB\xEC\xFEJ\r#\x02\xC8\xAB\x96\xB68\v\xDA0\xD7z"
ওয়াও, সেই বাইনারি স্ট্রিংটি দেখুন! এটিই আমাদের Message Authentication Code (MAC)।
আমরা SHA1-কে হ্যাশিং ফাংশন হিসেবে বেছে নিলাম (যেমন আমাদের TOTP ইমপ্লিমেন্টেশনও)। অনেক অন্য ফাংশন আছে, যেকোনো যেগুলোর নিজস্ব সিকিউরিটি এবং পারফরম্যান্স ইমপ্লিকেশন। হ্যাশিং অ্যালগরিদমের র্যাডিক্যাল পার্ট হচ্ছে যেকোনো ইনপুটের জন্য, আমরা একই আউটপুট পাব, প্রতিবার! এটি যেকোনো সাবটেল ইনপুট চেঞ্জ থেকে ব্যতিক্রমীভাবে ভিন্ন এবং ইউনিক আউটপুটও প্রোডিউস করবে (হেম, হ্যাশিং ফাংশনের উপর নির্ভর করে, কিন্তু চিন্তা করবেন না আমরা কলিশন নিয়ে তত চিন্তিত নই)।
এটিকে Message Authentication Code বলা হয় কারণ এটি ব্যবহার করা যায় একটি রিসিভড মেসেজ প্রমাণ করতে যে সেটি আউথেন্টিক। যদি আপনি এবং আমি সিক্রেট (my-secret-key) জানি, আমি আপনাকে মেসেজ the-earth-is-flat পাঠাতে পারি MACসহ। আপনাকে শুধু সেম ডাইজেস্ট ফাংশন চালাতে হবে সেম ইনপুটসহ, এবং যদি MACগুলো ম্যাচ করে, তবে আপনি মেসেজটি অথেন্টিকেট করলেন! আপনি জানেন সেটি ট্যাম্পার করা হয়নি এবং শুধু আমার কাছ থেকে আসতে পারত!
😎
টাইমকোড
চলে TOTP-এ ফিরে যাই। এবার টাইম-এর কথা বলার সময়। দেখুন, TOTP-এ, the-earth-is-flat এরকম প্রিপস্টারাস মেসেজ ডাইজেস্ট করার বদলে, আমরা একটি টাইম স্টেপ কাউন্ট (স্ট্রিং-এ কনভার্ট করা) ইনপুট হিসেবে ব্যবহার করি। আপনি যদি আপনার অথেন্টিকেটর অ্যাপ খুলেন, এবং কোডগুলো কখন সুইচ হয় সেটি দেখেন, আপনি একটি প্যাটার্ন লক্ষ্য করতে পারেন। সঠিক, আমার সাথে বলুন: "তারা মিনিট এবং হাফ মিনিটে সুইচ করে", খুব ভালো।
এটি মেসেজ ক্যালকুলেশন একটু সিম্পল করে দেয়। এই কেসে আমরা ৩০ সেকেন্ড ( টাইম স্টেপ ) এর রাউন্ডেড ডাউন কাউন্ট ব্যবহার করি যুনিক্স টাইমের শুরু থেকে (যদিও, unix time)। Ruby-এ আবার:
Time.now.to_i / 30
=> 51772900
আহা! এটিই আমাদের Message।
সুতরাং আমাদের অথেন্টিকেটর অ্যাপে, আমরা আমাদের বিশ্বস্ত ডাইজেস্ট ফাংশন ব্যবহার করে একটি নতুন HMAC পাই:
hmac = OpenSSL::HMAC.digest("SHA1", "avwe8aw71j2boib23jkbjk32", "51772900")
=> "H\x7F\xC1\xACL\xDA\xDB\xE7DQ\x91kE\x1C\xE3,c\nH\xA0"
get_otp_code(hmac) => "332204"
লাস্ট স্টেপ হচ্ছে এই বাইনারি স্ট্রিং থেকে নম্বর কোড বের করা। যেহেতু কিছু বিট ম্যানিপুলেশন দরকার, আমি আমাদের অনোনিমাস get_otp_code ফাংশনের পেছনে হাইড করছি। আপনি যদি চান, HOTP স্পেসিফিকেশনে কীভাবে কাজ করে সেটি পড়তে পারেন।
যখন আপনি কোডটি সার্ভারে সাবমিট করবেন, সেটি একই ডাইজেস্ট অপারেশন পারফর্ম করবে এবং কোডগুলো কমপেয়ার করবে। যখন সেগুলো ম্যাচ করে, আপনি ইন! যেহেতু আমরা টাইমের সাথে কাজ করছি, লেটেন্সি একটি ফ্যাক্টর। পসিবল ডিলে অ্যাকাউন্ট করার স্ট্র্যাটেজি আছে। সেটি বুঝতে আপনার হোমওয়ার্ক, যদি চান।
এটিই Time-Based One-Time Passwords-র কাজ করার সার গিস্ট!! 🎉 এই ইনফো ব্যবহার করে আপনার পরের ডিনার পার্টির লাইফ হোনার পর আমাকে থ্যাংক ইউ ইমেইল পাঠাতে মুক্ত আছেন!
ইমপ্লিমেন্টেশন
যদিও আমি মনে করি এই জিনিসগুলো কীভাবে কাজ করে সেটি বুঝা গুরুত্বপূর্ণ, ক্রিপ্টো রিলেটেড যেকোনো জিনিস রোল-ইয়োর-ওয়ান করা দৃঢ়ভাবে ডিসকারেজ করা হয়। Ruby/Rails ইকোসিস্টেমের একটি চমৎকার জিনিস হচ্ছে আপনি প্রায়শই একটি জেম (কখনো কখনো অনেক) পাবেন আপনার সমস্যা সমাধান করতে।
আমরা Honeybadger-এ devise ব্যবহার করি এবং একটি চমৎকার devise প্লাগইন আছে যেটি two_factor_authentication। কিছু 2FA ইমপ্লিমেন্টেশন আছে বেছে নেওয়ার জন্য, আমরা এইটি বেছে নিলাম কারণ:
- সিম্পল সেটআপ (একটি মাইগ্রেশন, কিছু কনফিগ এবং ইনিশিয়ালাইজার ছড়িয়ে থাকা)
- এটি One-Time কোডকে তার নিজস্ব পেজে এন্টার করার অনুমতি দেয় (বৈধ ইউজার/পাসওয়ার্ডের পর)
- একসেপটেবল ডিফল্টস, কিন্তু সহজে ওভাররাইড করা যায়
- এটিতে मैক্স লগইন অ্যাটেম্পটস চেকও আছে, যা স্পেসিফিকেশন দ্বারা রিকমেন্ডেড
কীভাবে এনাবল করবেন
সেটআপ সিম্পল: User Settings > Authentication পেজে যান, "Set Up Two Factor Authentication" সিলেক্ট করুন এবং Authy বা Google Authenticator (বা যেকোনো TOTP অ্যাপ) ব্যবহার করে সিক্রেট সিঙ্ক করার ডিরেকশন ফলো করুন।

বাস! পরবর্তীবার লগইন করলে, আমরা আপনাকে আপনার অথেন্টিকেটর কোডের জন্য প্রম্পট করব। সেটি ফিল করুন এবং সম্পূর্ণ শান্তি থেকে যান। 🧘

সিকিউরিটি এবং সিম্প্লিসিটি? এর চেয়ে ভালো কী হতে পারে?
একটা লাস্ট জিনিস: Pwned Password চেক
আমার সব অলগ পাসওয়ার্ডের সমর্থকদের জন্য একটি কুইক জিনিস। আমরা devise-pwned_password gem-ও ইন্টিগ্রেট করেছি। এখন থেকে, যখনই আপনি পাসওয়ার্ড রিকোয়ার্ড করার অপারেশন পারফর্ম করবেন, আমরা চেক করব প্রস্তাবিত পাসওয়ার্ড কোনো পরিচিত ডেটা ব্রিচে প্রিভ্যালেন্ট কিনা। আপনি যদি নতুন পাসওয়ার্ড যোগ করেন, এবং সেটি চেক ফেল করে, তবে আমরা সেটি আলাউ করব না।
আপনি যদি ইতিমধ্যে না হন, আমরা দৃঢ়ভাবে রিকমেন্ড করি পাসওয়ার্ড ম্যানেজার ব্যবহার করা (1Password হেম)।
Pwned Password-র আরও একটা ইন্টারেস্টিং বিট হচ্ছে আপনার পাসওয়ার্ড কীভাবে সিকিউয়ার থাকে থার্ড-পার্টি সার্ভিসের ডাটাবেস বিরুদ্ধে চেক করার সময়। এটিকে k-Anonymity বলা হয় এবং আপনি এখানে ওভারভিউ পেতে পারেন।
আজকে এটোই। পরের বার পর্যন্ত! 👋