পাসওয়ার্ড অ্যাটাক ও হ্যাশ ক্র্যাকিং কনসেপ্ট
এই পাঠে যা শিখবেন
- চারটি প্রধান পাসওয়ার্ড-অ্যাটাক কৌশল এবং কোনটি কোন পরিস্থিতিতে বেশি কার্যকর
- পাসওয়ার্ড স্ট্রেংথের পেছনের গণিত — keyspace = charset_sizelength, এবং কেন এটি সূচকীয় প্রবৃদ্ধি
- রেইনবো টেবিল কী এবং সল্টিং কীভাবে এটিকে সম্পূর্ণ অকার্যকর করে দেয়
- সল্টেড স্লো হ্যাশিং, রেট-লিমিটিং ও MFA — কেন একসাথে প্রয়োজন, একা কোনোটিই যথেষ্ট নয়
১ · পাসওয়ার্ড অ্যাটাকের প্রধান কৌশল
সম্ভাব্য প্রতিটি ক্যারেক্টার কম্বিনেশন পদ্ধতিগতভাবে চেষ্টা করা। কোনো অনুমান লাগে না, কিন্তু বড় keyspace-এ চরম সময়সাপেক্ষ।
এলোমেলো কম্বিনেশনের বদলে সাধারণ/ইতিমধ্যে ফাঁস হওয়া আসল পাসওয়ার্ডের একটি লিস্ট চেষ্টা করা — মানুষ প্রায়ই অনুমানযোগ্য পাসওয়ার্ড বাছে বলে ব্রুট ফোর্সের চেয়ে অনেক বেশি কার্যকর।
অন্য কোনো ওয়েবসাইটের ব্রিচ থেকে ফাঁস হওয়া ইউজারনেম/পাসওয়ার্ড জোড়া অন্য সাইটে চেষ্টা করা — পাসওয়ার্ড পুনর্ব্যবহারের অভ্যাসকে কাজে লাগায়।
প্রি-কম্পিউটেড hash → plaintext লুকআপ টেবিল — স্টোরেজের বিনিময়ে লুকআপ গতি কেনা। সল্টিং দিয়ে সম্পূর্ণ প্রতিরোধযোগ্য (নিচে বিস্তারিত)।
২ · পাসওয়ার্ড স্ট্রেংথের গণিত — keyspace
একটি পাসওয়ার্ডের সম্ভাব্য মোট সংখ্যা — একে keyspaceKeyspaceএকটি নির্দিষ্ট ক্যারেক্টার-সেট ও দৈর্ঘ্যের জন্য সম্ভাব্য মোট পাসওয়ার্ড কম্বিনেশনের সংখ্যা। বলা হয় — নিচের সূত্র দিয়ে গণনা করা হয়:
$$N = c^{l}$$
যেখানে c = ক্যারেক্টার-সেটের আকার (উদাহরণ: শুধু সংখ্যা = ১০টি সম্ভাব্য ক্যারেক্টার), এবং l = পাসওয়ার্ডের দৈর্ঘ্য। এটি একটি সূচকীয় (exponential) সম্পর্ক — অর্থাৎ দৈর্ঘ্য মাত্র কয়েক ক্যারেক্টার বাড়ালেই keyspace রৈখিকভাবে নয়, বরং বিস্ফোরকভাবে বেড়ে যায়।
৩ · কোড ডেমো — keyspace-এর সূচকীয় প্রবৃদ্ধি দেখা
নিচের কোড সেলটি সম্পূর্ণ নিরাপদ, বিশুদ্ধ গাণিতিক গণনা — এটি কোনো বাস্তব পাসওয়ার্ড ক্র্যাক করছে না, শুধু কয়েকটি উদাহরণ কম্বিনেশনের জন্য সম্ভাব্য keyspace-এর আকার ও একটি ইলাস্ট্রেটিভ গড়-ক্র্যাকিং-সময় গণনা করছে।
def format_duration(seconds):
if seconds < 1:
return f"{seconds * 1000:.3f} মিলিসেকেন্ড"
if seconds < 60:
return f"{seconds:.2f} সেকেন্ড"
if seconds < 3600:
return f"{seconds / 60:.2f} মিনিট"
if seconds < 86400:
return f"{seconds / 3600:.2f} ঘণ্টা"
days = seconds / 86400
if days < 365:
return f"{days:.2f} দিন"
return f"{days / 365:,.0f} বছর"
# (বিবরণ, charset_size, length)
combos = [
("শুধু সংখ্যা (0-9), দৈর্ঘ্য ৪", 10, 4),
("ছোট হাতের অক্ষর + সংখ্যা, দৈর্ঘ্য ৮", 36, 8),
("পূর্ণ চারসেট (বড়+ছোট হাতের অক্ষর+সংখ্যা+চিহ্ন), দৈর্ঘ্য ১২", 95, 12),
]
guesses_per_second = 1_000_000_000 # ইলাস্ট্রেটিভ অনুমান — প্রতি সেকেন্ডে ১ বিলিয়ন গেস (অফলাইন হার্ডওয়্যার আক্রমণ)
for label, charset_size, length in combos:
keyspace = charset_size ** length
avg_seconds = (keyspace / 2) / guesses_per_second # গড়ে অর্ধেক keyspace খুঁজলেই সাধারণত মিলে যায়
print(label)
print(f" keyspace আকার : {keyspace:,}")
print(f" গড় ব্রুট-ফোর্স সময়: {format_duration(avg_seconds)}")
print()
৪ · রেইনবো টেবিল ও সল্টিং কীভাবে সেটাকে অকার্যকর করে
Rainbow TableRainbow Tableজনপ্রিয় পাসওয়ার্ডগুলোর হ্যাশ আগে থেকেই কম্পিউট করে রাখা একটি বিশাল লুকআপ টেবিল — একবার তৈরি করলে, যেকোনো সংখ্যক হ্যাশ ক্র্যাক করতে বারবার ব্যবহার করা যায়। আক্রমণকারীকে প্রতিটি হ্যাশের জন্য আলাদাভাবে গণনা করতে হয় না — শুধু হ্যাশ ম্যাচ করা প্লেইনটেক্সট টেবিলে খুঁজে বের করলেই হয়। কিন্তু যদি প্রতিটি পাসওয়ার্ডে একটি ইউনিক, র্যান্ডম salt যোগ করে তারপর হ্যাশ করা হয় (ties to L19), তাহলে দুইজন ব্যবহারকারীর একই পাসওয়ার্ড থাকলেও তাদের চূড়ান্ত হ্যাশ সম্পূর্ণ ভিন্ন হয়ে যায় — একটি প্রি-কম্পিউটেড টেবিল তখন আর কাজে লাগে না, কারণ প্রতিটি ব্যবহারকারীর জন্য কার্যত একটি নতুন, ইউনিক সমস্যা সমাধান করতে হবে।
৫ · প্রতিরক্ষার স্তর — কোনোটিই একা যথেষ্ট নয়
সল্টেড স্লো হ্যাশিং (bcrypt, Argon2, বা PBKDF2 — ties to L19) প্রতিটি গেস-চেষ্টাকে ইচ্ছাকৃতভাবে ধীর করে দেয়, যা bulk brute-force-কে অব্যবহারিক করে তোলে। রেট-লিমিটিং (ties to L25) কতবার একটি অ্যাকাউন্টে লগইন চেষ্টা করা যাবে তা সীমিত করে, অনলাইন ব্রুট-ফোর্স ঠেকায়। MFA শুধু পাসওয়ার্ড জানাই যথেষ্ট নয় এমন একটি অতিরিক্ত স্তর যোগ করে। আর breach-list checking (haveibeenpwned-স্টাইল, ব্যবহারকারীর নতুন পাসওয়ার্ড ইতিমধ্যে কোনো পরিচিত ব্রিচে ফাঁস হয়েছে কি না তা যাচাই করা) ব্যবহারকারীকে ইতিমধ্যে-কম্প্রোমাইজড পাসওয়ার্ড বেছে নেওয়া থেকে বিরত রাখে। এই চারটি স্তর ভিন্ন ভিন্ন আক্রমণ-পথ বন্ধ করে — একটি বাদ দিলে সেই নির্দিষ্ট পথটি খোলা থেকে যায়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ Dictionary attack সাধারণত pure brute force-এর চেয়ে বেশি কার্যকর কেন, যদিও এটি সম্পূর্ণ keyspace কভার করে না?
মানুষ সত্যিকারের র্যান্ডম পাসওয়ার্ড বেছে নেয় না — তারা প্রায়ই সাধারণ শব্দ, নাম, তারিখ বা ইতিমধ্যে অন্য ব্রিচে ফাঁস হওয়া পাসওয়ার্ড ব্যবহার করে। একটি ডিকশনারি লিস্ট এই বাস্তব-জীবনের প্যাটার্নকে লক্ষ্য করে, তাই সম্পূর্ণ keyspace কভার না করেও অনেক বেশি "হিট রেট" পায় — কম চেষ্টায় বেশি সফলতা। এই কারণেই দুর্বল, অনুমানযোগ্য পাসওয়ার্ড এত বিপজ্জনক, এমনকি বড় keyspace-এর মধ্যেও।
প্র ০২ দুইজন ব্যবহারকারীর পাসওয়ার্ড হুবহু একই হলেও, সল্টিং থাকলে তাদের সংরক্ষিত হ্যাশ কেন ভিন্ন হয়?
কারণ হ্যাশ কম্পিউট করা হয় পাসওয়ার্ড + সেই ব্যবহারকারীর জন্য নির্দিষ্ট, ইউনিক র্যান্ডম salt একসাথে জুড়ে দিয়ে। ইনপুট (পাসওয়ার্ড+salt) ভিন্ন হলে হ্যাশ ফাংশনের avalanche effect (L01) অনুযায়ী আউটপুটও সম্পূর্ণ ভিন্ন হয়ে যায় — এই কারণেই একটি প্রি-কম্পিউটেড রেইনবো টেবিল অকার্যকর হয়ে পড়ে, প্রতিটি ব্যবহারকারীর জন্য আলাদাভাবে গণনা করতে হবে।
প্র ০৩ keyspace সূত্রে (charset_size^length) দৈর্ঘ্য এক বাড়ানো, নাকি ক্যারেক্টার-সেট এক ক্যাটাগরি (যেমন চিহ্ন) বাড়ানো — কোনটি সাধারণত keyspace-কে বেশি বাড়ায়?
সাধারণত দৈর্ঘ্য বাড়ানোর প্রভাব বেশি, কারণ length সূত্রে সূচকে (exponent) থাকে, যেখানে charset_size শুধু ভিত্তি (base) হিসেবে কাজ করে। উদাহরণস্বরূপ, charset ৩৬ থেকে ৯৫-এ বাড়ালে ভিত্তি প্রায় ২.৬ গুণ বাড়ে, কিন্তু length ৮ থেকে ৯-এ বাড়ালে পুরো keyspace ৩৬ বা ৯৫ গুণ বেড়ে যায় (নতুন ভিত্তি অনুযায়ী) — এই কারণেই নিরাপত্তা পরামর্শে প্রায়ই "দৈর্ঘ্যই রাজা" (length is king) এমন কথা বলা হয়।
অনুশীলন
-
পরীক্ষা করুন: কোড সেলে
combos-এ একটি নতুন এন্ট্রি যোগ করুন —("পূর্ণ চারসেট, দৈর্ঘ্য ৮", 95, 8)— এবং দেখুন এটি তৃতীয় কম্বিনেশনের (দৈর্ঘ্য ১২) তুলনায় কতটা দুর্বল।যদিও charset একই (৯৫), শুধু দৈর্ঘ্য ৮ হওয়ায় keyspace উল্লেখযোগ্যভাবে ছোট হবে দৈর্ঘ্য ১২-এর তুলনায় — পার্থক্যটি ৯৫৪ গুণ (প্রায় ৮ কোটির বেশি গুণ)। এটি আবার নিশ্চিত করে যে শুধু charset বড় রাখা যথেষ্ট নয়, দৈর্ঘ্যও একইসাথে গুরুত্বপূর্ণ।
-
চিন্তা করুন: একজন ব্যবহারকারী যদি একটি খুব শক্তিশালী, দীর্ঘ পাসওয়ার্ড ব্যবহার করেন কিন্তু সেটি একাধিক ওয়েবসাইটে পুনর্ব্যবহার করেন, তাহলে credential stuffing আক্রমণের বিরুদ্ধে সেই পাসওয়ার্ডের "শক্তি" কতটা সুরক্ষা দেয়?
প্রায় কোনো সুরক্ষাই দেয় না। Credential stuffing পাসওয়ার্ড অনুমান বা ক্র্যাক করে না — এটি ইতিমধ্যে অন্য কোনো ব্রিচ থেকে ফাঁস হওয়া, সঠিক প্লেইনটেক্সট পাসওয়ার্ড সরাসরি ব্যবহার করে। তাই পাসওয়ার্ডের keyspace/শক্তি এখানে অপ্রাসঙ্গিক — একমাত্র সুরক্ষা হলো প্রতিটি সাইটে আলাদা, অপুনরাবৃত্ত পাসওয়ার্ড ব্যবহার করা (এবং MFA যোগ করা)।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৬০টি পাঠ পরবর্তী পাঠ — প্রিভিলেজ এস্কেলেশন বেসিকস।
- Discrete Mathematics কোর্স সহায়ক কোর্স কম্বিনেটরিক্স ও এক্সপোনেন্ট গণিত আরও গভীরভাবে শিখতে দেখুন — keyspace গণনার ভিত্তি।
- System Design & Software Architecture কোর্স সঙ্গী কোর্স পাসওয়ার্ড স্টোরেজ, হ্যাশিং ও অথেন্টিকেশন আর্কিটেকচার কীভাবে ডিজাইন করা হয় তা শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design ও Cybersecurity — সব এক জায়গায়।