MD5 হ্যাশিং কী?
MD5 (Message-Digest Algorithm 5) হল একটি ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন যা যেকোনো ইনপুট থেকে — আকার নির্বিশেষে — একটি নির্দিষ্ট 128-bit (16-byte) ডাইজেস্ট তৈরি করে। ১৯৯২ সালে Ronald Rivest RFC 1321-এ প্রকাশ করেন, MD5 MD4-এর দ্রুততর উত্তরসূরি হিসেবে ডিজাইন করা হয়েছিল এবং দ্রুত ইন্টারনেটে সবচেয়ে বেশি ব্যবহৃত হ্যাশ ফাংশনগুলির একটি হয়ে ওঠে। অ্যালগরিদমটি ইনপুটকে 512-bit ব্লকে প্রক্রিয়া করে চার রাউন্ডে ১৬টি করে মোট ৬৪টি অপারেশনের মধ্য দিয়ে, প্রতি রাউন্ডে ভিন্ন নন-লিনিয়ার ফাংশন ব্যবহার করে, এবং ৩২-অক্ষরের হেক্সাডেসিমাল ফিঙ্গারপ্রিন্ট তৈরি করে।
হ্যাশ ফাংশন হল এক-মুখী রূপান্তর: ইনপুট দিলে তাৎক্ষণিকভাবে হ্যাশ গণনা করা যায়, কিন্তু শুধু হ্যাশ থেকে মূল ইনপুট পুনরুদ্ধার করা সম্ভব নয়। ইনপুটে মাত্র একটি বিট পরিবর্তন করলেও সম্পূর্ণ আলাদা একটি ডাইজেস্ট তৈরি হয় — এই বৈশিষ্ট্যকে avalanche effect বলা হয়। MD5 অসীম ইনপুট স্থানকে নির্দিষ্ট 128-bit আউটপুট স্থানে ম্যাপ করে, তাই collision (দুটি ভিন্ন ইনপুট একই হ্যাশ তৈরি করে) গাণিতিকভাবে অবশ্যম্ভাবী, কিন্তু একটি নিরাপদ হ্যাশ ফাংশন সেগুলো খুঁজে বের করাকে গণনাগতভাবে অসাধ্য করে তোলে।
২০০৪ সাল থেকে গবেষকরা MD5-এর বিরুদ্ধে ব্যবহারিক collision আক্রমণ প্রদর্শন করেছেন, অর্থাৎ ডিজিটাল স্বাক্ষর, সার্টিফিকেট বা collision resistance প্রয়োজন এমন যেকোনো প্রেক্ষাপটে এটি আর নিরাপদ নয়। তবে MD5 অ-নিরাপত্তা উদ্দেশ্যে এখনো ব্যাপকভাবে ব্যবহৃত হয়: ডাউনলোডের পরে ফাইলের অখণ্ডতা যাচাই, ক্যাশ কী তৈরি, কন্টেন্ট ডিডুপ্লিকেশন এবং স্ট্রিং থেকে নির্ধারণবাদী শনাক্তকারী তৈরিতে। এই ব্যবহারগুলোর জন্য অ্যালগরিদমের গতি ও সর্বজনীন লাইব্রেরি সমর্থন এটিকে একটি ব্যবহারিক পছন্দ করে তোলে। ২০০৮ সালে Marc Stevens এবং সহকর্মীরা chosen-prefix collision আক্রমণ প্রকাশ করেন, অর্থাৎ একজন আক্রমণকারী ইচ্ছামতো chosen prefix সহ দুটি দলিল তৈরি করতে পারেন যারা একই ডাইজেস্ট শেয়ার করে। এই কৌশলটি ২০০৮ সালের Chaos Communication Congress-এ একটি নকল Certification Authority সার্টিফিকেট তৈরি করে প্রদর্শন করা হয়। ২০১২ সালে Flame ম্যালওয়্যার পরবর্তীতে Microsoft কোড-সাইনিং সার্টিফিকেট জাল করতে chosen-prefix collision ব্যবহার করে, যা ম্যালওয়্যারকে বৈধ Windows Update প্যাকেজ হিসেবে ছদ্মবেশ ধারণ করতে সক্ষম করে। এই বাস্তব-জগতের শোষণগুলো নিশ্চিত করে যে যেসব ক্ষেত্রে বিশ্বাস নির্ভর করে সেখানে অ্যালগরিদমটি ক্রিপ্টোগ্রাফিকভাবে ভঙ্গ এবং যেখানে আক্রমণকারী হ্যাশ করা ইনপুট প্রভাবিত করতে পারে সেখানে এর উপর নির্ভর করা উচিত নয়।
RFC 1321 — The MD5 Message-Digest Algorithm →
কেন এই MD5 জেনারেটর ব্যবহার করবেন?
কিছু ইনস্টল না করে বা কোড না লিখে তাৎক্ষণিকভাবে MD5 হ্যাশ তৈরি করুন। আপনার টেক্সট পেস্ট করুন এবং রিয়েল টাইমে ৩২-অক্ষরের হেক্স ডাইজেস্ট পান।
MD5-এর ব্যবহার ক্ষেত্র
MD5 বনাম অন্য হ্যাশ অ্যালগরিদম
MD5 হল সাধারণ হ্যাশ অ্যালগরিদমগুলির মধ্যে দ্রুততম ও সংক্ষিপ্ততম, কিন্তু এটি সবচেয়ে দুর্বল নিরাপত্তা নিশ্চয়তা দেয়। নিচের সারণিটি প্রতিটি অ্যালগরিদমের ডাইজেস্টের আকার, মান ও উপযুক্ত ব্যবহার ক্ষেত্র তুলনা করে।
| অ্যালগরিদম | ডাইজেস্টের আকার | হেক্সের দৈর্ঘ্য | মান | সবচেয়ে উপযুক্ত |
|---|---|---|---|---|
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums, non-security fingerprints |
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Legacy git commits (being replaced) |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, backup standard |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
MD5 কীভাবে কাজ করে
MD5 Merkle-Damgård কনস্ট্রাকশনের মাধ্যমে ইনপুট প্রক্রিয়া করে: বার্তাটিকে 512 বিটের গুণিতকে প্যাড করা হয়, ব্লকে বিভক্ত করা হয় এবং প্রতিটি ব্লক চার রাউন্ডে ১৬টি বিটওয়াইজ অপারেশনের মধ্য দিয়ে যায় যা ইনপুটকে প্রিকম্পিউটেড sine-প্রাপ্ত ধ্রুবকের সাথে মেশায়। ফলাফল হল একটি 128-bit অবস্থা যা চূড়ান্ত ডাইজেস্টে পরিণত হয়।
প্রতিটি রাউন্ড চারটি 32-bit স্টেট ওয়ার্ড (A, B, C, D)-এর মধ্যে তিনটিতে একটি স্বতন্ত্র নন-লিনিয়ার সহায়ক ফাংশন প্রয়োগ করে। রাউন্ড ১ ব্যবহার করে F(B,C,D) = (B AND C) OR (NOT B AND D) — একটি বিটওয়াইজ শর্তাধীন নির্বাচক। রাউন্ড ২ ব্যবহার করে G(B,C,D) = (B AND D) OR (C AND NOT D) — একটি পরিপূরক নির্বাচক। রাউন্ড ৩ ব্যবহার করে H(B,C,D) = B XOR C XOR D — একটি সমতা ফাংশন। রাউন্ড ৪ ব্যবহার করে I(B,C,D) = C XOR (B OR NOT D) — একটি অসামঞ্জস্যপূর্ণ সংযোজক। এই চারটি ফাংশন নিশ্চিত করে যে ইনপুটের প্রতিটি বিট আউটপুট ডাইজেস্টকে প্রভাবিত করে। এর ফলে avalanche effect তৈরি হয় — ছোট ইনপুট পরিবর্তনও ফলাফল হ্যাশে বড় ও অপ্রত্যাশিত পরিবর্তন আনে।
MD5: 5eb63bbbe01eeed093cb22bb8f5acdc3
(128 bits = 16 bytes = 32 hex characters)
অ্যালগরিদমটি পাঁচটি ধাপে এগিয়ে যায়: (১) একটি 1-bit যোগ করুন, তারপর শূন্য যোগ করুন যতক্ষণ না বার্তার দৈর্ঘ্য 448 mod 512 হয়; (২) মূল বার্তার দৈর্ঘ্য 64-bit little-endian পূর্ণসংখ্যা হিসেবে যোগ করুন; (৩) চারটি 32-bit স্টেট ভেরিয়েবল (A, B, C, D) নির্দিষ্ট ধ্রুবক দিয়ে ইনিশিয়ালাইজ করুন; (৪) প্রতিটি 512-bit ব্লককে ৬৪টি অপারেশনে চার নন-লিনিয়ার ফাংশন (F, G, H, I) ব্যবহার করে প্রক্রিয়া করুন, প্রতি রাউন্ডে ১৬টি; (৫) ফলাফলের অবস্থা চলমান মোটের সাথে যোগ করুন এবং little-endian বাইট অর্ডারে চূড়ান্ত 128-bit হ্যাশ আউটপুট করুন।
কোডের উদাহরণ
জনপ্রিয় ভাষা ও পরিবেশে MD5 হ্যাশ কীভাবে তৈরি করবেন। লক্ষ্য করুন যে MD5 ব্রাউজারের Web Crypto API-তে পাওয়া যায় না — একটি লাইব্রেরি বা Node.js ব্যবহার করুন।
// MD5 is not available in Web Crypto API (it only supports SHA-*)
// Use a library like 'js-md5' or the Node.js crypto module
// Node.js (built-in crypto)
const crypto = require('crypto')
const hash = crypto.createHash('md5').update('hello world').digest('hex')
console.log(hash) // → "5eb63bbbe01eeed093cb22bb8f5acdc3"
// With Unicode input
crypto.createHash('md5').update('cafe\u0301').digest('hex')
// → "4fad076bae205e95bec9dacea498e2ab"import hashlib
# Basic MD5 hash
result = hashlib.md5(b'hello world').hexdigest()
print(result) # → "5eb63bbbe01eeed093cb22bb8f5acdc3"
# Hash a string (must encode to bytes first)
text = 'hello world'
hashlib.md5(text.encode('utf-8')).hexdigest()
# → "5eb63bbbe01eeed093cb22bb8f5acdc3"
# Hash a file
with open('file.bin', 'rb') as f:
md5 = hashlib.md5()
for chunk in iter(lambda: f.read(8192), b''):
md5.update(chunk)
print(md5.hexdigest())package main
import (
"crypto/md5"
"fmt"
)
func main() {
data := []byte("hello world")
hash := md5.Sum(data)
fmt.Printf("%x\n", hash)
// → 5eb63bbbe01eeed093cb22bb8f5acdc3
}# Using md5sum (Linux) or md5 (macOS) echo -n "hello world" | md5sum # → 5eb63bbbe01eeed093cb22bb8f5acdc3 - # macOS echo -n "hello world" | md5 # → 5eb63bbbe01eeed093cb22bb8f5acdc3 # Hash a file md5sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl md5 # → MD5(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3