এখানে সবচেয়ে upvoted উত্তর কি জোর দেওয়া পক্ষান্তরে অ injectivity (অর্থাত বেশ কিছু স্ট্রিং একই মান হ্যাশ আছে) বড় (সম্ভাব্য অসীম) ইনপুট আকার এবং সংশোধন করা হয়েছে আউটপুটের আকার মধ্যে পার্থক্য দ্বারা ঘটিত একটি ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন নয় গুরুত্বপূর্ণ বিষয় - প্রকৃতপক্ষে, আমরা হ্যাশ ফাংশনগুলিকে পছন্দ করি যেখানে সেই সংঘর্ষগুলি খুব কমই ঘটে।
এই ফাংশনটি বিবেচনা করুন (পিএইচপি সংকেত হিসাবে, প্রশ্ন হিসাবে):
function simple_hash($input) {
return bin2hex(substr(str_pad($input, 16), 0, 16));
}
এটি কিছু স্পেস যুক্ত করে, যদি স্ট্রিং খুব ছোট হয় এবং তারপরে স্ট্রিংয়ের প্রথম 16 বাইট নেয়, তবে এটিকে হেক্সাডেসিমাল হিসাবে এনকোড করে। এটির এমডি 5 হ্যাশের সমান আউটপুট আকার রয়েছে (32 হেক্সাডেসিমাল অক্ষর বা 16 বাইট যদি আমরা বিন 2hex অংশ বাদ দিই)।
print simple_hash("stackoverflow.com");
এটি আউটপুট দেবে:
737461636b6f766572666c6f772e636f6d
এই ফাংশনটিতে এমডি 5 এর জন্য কোডির উত্তর দ্বারা হাইলাইটের মতো একই অ-ইনজেকটিভিটি সম্পত্তি রয়েছে: আমরা যে কোনও আকারের স্ট্রিংগুলিতে (যতক্ষণ না তারা আমাদের কম্পিউটারে ফিট করে) পাস করতে পারি, এবং এটি কেবল 32 হেক্স-ডিজিটের আউটপুট তৈরি করবে। অবশ্যই এটি ইনজেকশন হতে পারে না।
তবে এক্ষেত্রে একই স্টাফের মানচিত্রের স্ট্রিংটি খুঁজে পাওয়া তুচ্ছ (কেবল hex2bin
আপনার হ্যাশের উপর প্রয়োগ করুন, এবং এটি আপনার কাছে রয়েছে)। যদি আপনার মূল স্ট্রিংটির দৈর্ঘ্য 16 হয় (আমাদের উদাহরণ হিসাবে), আপনি এমনকি এই মূল স্ট্রিংটি পাবেন। এমডি 5 এর পক্ষে এই জাতীয় কিছুই সম্ভব না হওয়া উচিত, এমনকি আপনি যদি জানেন যে ইনপুটটির দৈর্ঘ্যটি খুব কম ছিল (যতক্ষণ না আমরা কোনও মিল খুঁজে না পাওয়া অবধি সমস্ত সম্ভাব্য ইনপুট চেষ্টা করেই দেখি, যেমন একটি ব্রুট-ফোর্স আক্রমণ)।
ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনটির জন্য গুরুত্বপূর্ণ অনুমানগুলি হ'ল:
- প্রদত্ত হ্যাশ উত্পাদনকারী কোনও স্ট্রিং খুঁজে পাওয়া শক্ত (প্রিমাইজ প্রতিরোধ)
- প্রদত্ত স্ট্রিংয়ের মতো একই হ্যাশ উত্পাদনকারী কোনও পৃথক স্ট্রিং খুঁজে পাওয়া শক্ত (দ্বিতীয় প্রিমাইজ প্রতিরোধ)
- একই হ্যাশ (সংঘর্ষ প্রতিরোধ) এর সাথে কোনও জোড় স্ট্রিং পাওয়া শক্ত
অবশ্যই আমার simple_hash
ফাংশন এই শর্তগুলির কোনওটিই পূরণ করে না। (প্রকৃতপক্ষে, আমরা যদি ইনপুট স্পেসটিকে "16-বাইট স্ট্রিং" এ সীমাবদ্ধ রাখি তবে আমার ফাংশনটি ইনজেকশন হয়ে যায়, এবং এটি দ্বিতীয়-প্রিমিয়াম প্রতিরোধী এবং সংঘর্ষ প্রতিরোধীও প্রমাণযোগ্য))
এমডি 5 এর বিরুদ্ধে এখন সংঘর্ষের আক্রমণ রয়েছে (উদাহরণস্বরূপ, একটি নির্দিষ্ট উপসর্গের সাথেও বেশ কয়েকটি কাজ সহ একাধিক স্ট্রিং তৈরি করা সম্ভব, যা বেশ কিছু কাজ সহ অসম্ভব কাজ নয়), সুতরাং আপনার ব্যবহার করা উচিত নয় গুরুতর কিছু জন্য MD5। এখনও প্রাক প্রাক আক্রমণ করা হয়নি, তবে আক্রমণ আরও ভাল হবে।
আসল প্রশ্নের উত্তর দিতে:
এই ফাংশনগুলি সম্পর্কে কী এমন ফলাফল যা ফলস্বরূপ স্ট্রিংগুলি পুনরায় সন্ধান করা অসম্ভব করে তোলে?
এমডি 5 (এবং অন্যান্য হ্যাশ ফাংশন Merkle-Damgard নির্মাণের উপর কার্যকরভাবে কার্যকরভাবে) কী হিসাবে বার্তাটি একটি এনক্রিপশন অ্যালগরিদম প্রয়োগ করে এবং "প্লেইন পাঠ্য" হিসাবে কিছু স্থির মান হিসাবে ব্যবহার করে, ফলে সিফেরেক্সটকে হ্যাশ হিসাবে ব্যবহার করে। (তার আগে, ইনপুটটি প্যাডযুক্ত এবং ব্লকগুলিতে বিভক্ত হয়, এই প্রতিটি ব্লক পূর্ববর্তী ব্লকের আউটপুট এনক্রিপ্ট করতে ব্যবহৃত হয়, বিপরীত গণনা রোধ করতে এর ইনপুট দিয়ে এক্সওরড হয়))
আধুনিক এনক্রিপশন অ্যালগরিদমগুলি (হ্যাশ ফাংশনগুলিতে ব্যবহৃত একটিগুলি সহ) কীটি পুনরুদ্ধার করা শক্ত করার জন্য এমনভাবে তৈরি করা হয়েছে, এমনকি প্লেইনেক্সট এবং সিফারেক্সট উভয়ই দেওয়া (বা এমনকি বিরোধীরা তাদের মধ্যে একটি চয়ন করলেও)। তারা সাধারণত বিট-শাফলিং অপারেশনগুলি এমনভাবে করে থাকে যাতে প্রতিটি আউটপুট বিট প্রতিটি কী বিট (কয়েকবার) এবং প্রতিটি ইনপুট বিটের দ্বারা নির্ধারিত হয়। আপনি যদি পুরো কী এবং ইনপুট বা আউটপুট জানেন তবে আপনি কেবল সহজেই ভিতরে যা ঘটে তা পুনরায় সন্ধান করতে পারেন।
MD5- এর মতো হ্যাশ ফাংশন এবং প্রিমেজ আক্রমণ (একক-ব্লক হ্যাশ স্ট্রিং সহ, জিনিসগুলি সহজ করার জন্য) আপনার কাছে কেবল আপনার এনক্রিপশন ফাংশনের ইনপুট এবং আউটপুট রয়েছে, তবে কীটি নয় (এটি আপনি খুঁজছেন)।