ঠিক আছে, আপনি এটি উইকিপিডিয়ায় সন্ধান করতে পারেন ... তবে আপনি যেহেতু ব্যাখ্যা চান, তাই আমি এখানে যথাসাধ্য চেষ্টা করব:
হ্যাশ ফাংশন
তারা একটি স্বেচ্ছাসেবী দৈর্ঘ্যের ইনপুট এবং একটি (সাধারণত) নির্দিষ্ট দৈর্ঘ্য (বা ছোট দৈর্ঘ্য) আউটপুট মধ্যে ম্যাপিং সরবরাহ করে। এটি সাধারণ crc32 থেকে এমডি 5 বা এসএএএ 1/2/256/512 এর মতো একটি সম্পূর্ণ ফুঁকানো ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন পর্যন্ত কিছু হতে পারে। মুল বক্তব্যটি হচ্ছে ওয়ান-ওয়ে ম্যাপিং চলছে। এটি সর্বদা অনেকগুলি: 1 ম্যাপিং (যার অর্থ সর্বদা সংঘর্ষ হবে) যেহেতু প্রতিটি ক্রিয়াকলাপ ইনপুট করতে সক্ষমের তুলনায় একটি ছোট আউটপুট উত্পাদন করে (যদি আপনি এমডি 5 তে প্রতিটি 1 এমবি ফাইল সরবরাহ করেন তবে আপনি এক টন সংঘর্ষ পাবেন)।
তারা অভ্যন্তরীণভাবে কীভাবে কাজ করে তার কারণ হিসাবে তারা বিপরীত হওয়াতে কঠোর (বা ব্যবহারিক ক্ষেত্রে অসম্ভব) is বেশিরভাগ ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলি আউটপুট উত্পাদন করতে ইনপুট সেটটিতে বহুবার পুনরাবৃত্তি করে। সুতরাং আমরা যদি প্রতিটি নির্দিষ্ট দৈর্ঘ্যের ইনপুট (যা অ্যালগোরিদম নির্ভর) এর দিকে লক্ষ্য করি, হ্যাশ ফাংশনটিকে বর্তমান অবস্থাকে কল করবে। এরপরে এটি রাজ্যটিতে পুনরাবৃত্তি হবে এবং এটিকে একটি নতুন হিসাবে পরিবর্তন করবে এবং এটিকে নিজের মধ্যে প্রতিক্রিয়া হিসাবে ব্যবহার করবে (এমডি 5 এটি প্রতিটি 512 বিট ডেটা খণ্ডের জন্য 64৪ বার করে)। এরপরে এটি কোনওভাবে এই সমস্ত পুনরাবৃত্তির থেকে ফলাফলগুলি স্থিত করে আবার একত্রিত করে ফলাফল হ্যাশ গঠন করে।
এখন, আপনি যদি হ্যাশটি ডিকোড করতে চেয়েছিলেন তবে প্রথমে প্রদত্ত হ্যাশটিকে তার পুনরাবৃত্ত অবস্থার মধ্যে কীভাবে বিভক্ত করবেন তা নির্ধারণ করতে হবে (বৃহত ইনপুটগুলির জন্য অনেকগুলি ডেটার অংশের আকারের চেয়ে ছোট ইনপুটগুলির সম্ভাবনা)। তারপরে আপনাকে প্রতিটি রাজ্যের জন্য পুনরাবৃত্তিটি বিপরীত করতে হবে। এখন, ব্যাখ্যা কেন এই খুব কঠিন, অনুমান করার চেষ্টা কল্পনা a
এবং b
নিম্নলিখিত সূত্র থেকে: 10 = a + b
। এখানে 10 টি ইতিবাচক সমন্বয় রয়েছে a
এবং b
এটি কাজ করতে পারে। এখন যে একগুচ্ছ সময় লুপ:tmp = a + b; a = b; b = tmp
। Ite৪ টি পুনরাবৃত্তির জন্য, আপনার চেষ্টা করার জন্য 10 ^ 64 এর বেশি সম্ভাবনা রয়েছে। এবং এটি কেবল একটি সরল সংযোজন যেখানে কিছু রাজ্য পুনরাবৃত্তি থেকে পুনরাবৃত্তি পর্যন্ত সংরক্ষণ করা হয়। রিয়েল হ্যাশ ফাংশনগুলি 1 টিরও বেশি অপারেশন করে (MD5 4 রাষ্ট্রের ভেরিয়েবলের উপরে প্রায় 15 টি অপারেশন করে)। এবং যেহেতু পরবর্তী পুনরাবৃত্তিটি পূর্বের অবস্থার উপর নির্ভর করে এবং বর্তমান অবস্থা তৈরিতে পূর্ববর্তীটি ধ্বংস হয়ে যায়, তাই প্রদত্ত আউটপুট রাষ্ট্রের (প্রতিটি পুনরাবৃত্তির জন্য কম নয়) যে ইনপুট রাষ্ট্রটি নির্ধারণ করা হয়েছিল তা নির্ধারণ করা সবই অসম্ভব। একত্রিত করুন যে বিপুল সংখ্যক সম্ভাবনার সাথে জড়িত রয়েছে, এবং একটি এমডি 5 ডিকোডিংয়ের ফলে নিকটতম সীমাহীন (তবে অসীম নয়) সংস্থান রয়েছে। এত সম্পদ যে এটি '
এনক্রিপশন ফাংশন
তারা একটি স্বেচ্ছাসেবী দৈর্ঘ্যের ইনপুট এবং আউটপুট মধ্যে 1: 1 ম্যাপিং প্রদান। এবং তারা সবসময় বিপরীতমুখী হয়। গুরুত্বপূর্ণ বিষয়টি লক্ষ্যণীয় হ'ল এটি কোনও পদ্ধতি ব্যবহার করে বিপরীত। এবং প্রদত্ত কীটির জন্য এটি সর্বদা 1: 1 থাকে। এখন, একাধিক ইনপুট রয়েছে: কী জোড়গুলি যা একই আউটপুট উত্পন্ন করতে পারে (বাস্তবে সাধারণত এনক্রিপশন ফাংশনের উপর নির্ভর করে থাকে)। ভাল এনক্রিপ্ট করা ডেটা এলোমেলো গোলমাল থেকে পৃথক করা যায়। এটি একটি ভাল হ্যাশ আউটপুট থেকে পৃথক যা সর্বদা ধারাবাহিক বিন্যাসে থাকে।
ব্যবহারের ক্ষেত্রে
আপনি যখন কোনও মানের তুলনা করতে চান তবে একটি হ্যাশ ফাংশন ব্যবহার করুন তবে প্লেইন উপস্থাপনা (কোনও কারণেই) সংরক্ষণ করতে পারবেন না। পাসওয়ার্ডগুলি এই ব্যবহারের ক্ষেত্রে খুব ভাল ফিট করা উচিত যেহেতু আপনি সুরক্ষার কারণে তাদের প্লে-টেক্সট সংরক্ষণ করতে চান না (এবং এমনটি করা উচিত নয়)। তবে আপনি যদি পাইরেটেড মিউজিক ফাইলগুলির জন্য একটি ফাইল সিস্টেম পরীক্ষা করতে চান? সংগীত ফাইলের জন্য 3 এমবি সঞ্চয় করা অবৈধ হবে। সুতরাং পরিবর্তে, ফাইলের হ্যাশ নিন এবং এটি সংরক্ষণ করুন (এমডি 5 3 এমবি এর পরিবর্তে 16 বাইট সংরক্ষণ করবে)। এইভাবে, আপনি কেবল প্রতিটি ফাইল হ্যাশ করেছেন এবং হ্যাশগুলির সঞ্চিত ডাটাবেসের সাথে তুলনা করুন (পুনরায় এনকোডিংয়ের কারণে ফাইলের শিরোনাম পরিবর্তন করা ইত্যাদি কারণে এটি বাস্তবে কার্যকরভাবে কাজ করে না তবে এটি ব্যবহারের ক্ষেত্রে একটি উদাহরণ)।
আপনি ইনপুট ডেটার বৈধতা যাচাই করার সময় একটি হ্যাশ ফাংশন ব্যবহার করুন। এটি তাদের জন্য ডিজাইন করা হয়েছে। আপনার কাছে যদি 2 টি ইনপুট থাকে এবং সেগুলি একই কিনা তা পরীক্ষা করতে চান, একটি হ্যাশ ফাংশন দিয়ে উভয়ই চালান। সংঘর্ষের সম্ভাবনাটি ছোট ইনপুট আকারের (একটি ভাল হ্যাশ ফাংশন ধরে) জন্য জ্যোতির্বিজ্ঞানগতভাবে কম। এজন্য এটি পাসওয়ার্ডের জন্য প্রস্তাবিত। 32 টি অক্ষর পর্যন্ত পাসওয়ার্ডের জন্য, এমডি 5 এর আউটপুট স্পেসের 4 গুণ বেশি। SHA1 এর আউটপুট স্পেসের প্রায় 6 গুণ (প্রায়)। SHA512 এর আউটপুট স্পেস প্রায় 16 গুণ রয়েছে। পাসওয়ার্ডটি কী ছিল তা আপনি সত্যিই যত্নশীল হন না, এটি সংরক্ষণ করা শৃঙ্খলার মতো হয়ে থাকলে আপনার যত্নশীল। এজন্য আপনার পাসওয়ার্ডের জন্য হ্যাশ ব্যবহার করা উচিত।
যখনই আপনাকে ইনপুট ডেটা ফেরত পেতে দরকার হয় এনক্রিপশন ব্যবহার করুন। শব্দটির প্রয়োজনটি লক্ষ্য করুন । আপনি যদি ক্রেডিট কার্ড নম্বরগুলি সংরক্ষণ করে থাকেন তবে আপনাকে সেগুলি আবার কিছুক্ষণের মধ্যে ফিরিয়ে আনা দরকার তবে এগুলি সাধারণ পাঠ্য সংরক্ষণ করতে চান না। সুতরাং পরিবর্তে, এনক্রিপ্ট করা সংস্করণ সঞ্চয় করুন এবং কীটি যতটা সম্ভব নিরাপদ রাখুন।
ডেটা সাইন ইন করার জন্য হ্যাশ ফাংশনগুলি দুর্দান্ত। উদাহরণস্বরূপ, আপনি যদি এইচএমএসি ব্যবহার করছেন তবে আপনি একটি পরিচিত তবে সংক্রমণিত মান (একটি গোপন মান) দিয়ে একচেটিয়া ডেটা হ্যাশ করে ডেটা টুকরা সই করবেন। সুতরাং, আপনি সরল পাঠ্য এবং এইচএমএসি হ্যাশ প্রেরণ করুন। তারপরে, রিসিভারটি সহজেই জ্ঞাত মান সহ জমা দেওয়া ডেটা হ্যাশ করে এবং এটি সংক্রমণকৃত HMAC এর সাথে মেলে কিনা তা পরীক্ষা করে দেখুন। যদি এটি একই হয় তবে আপনি জানেন যে এটি কোনও গোপনীয় মান ব্যতীত কোনও পক্ষের সাথে छेলাচল করে না। এটি সাধারণত এইচটিটিপি ফ্রেমওয়ার্কগুলি দ্বারা সুরক্ষিত কুকি সিস্টেমগুলিতে ব্যবহৃত হয়, পাশাপাশি এইচটিটিপি-র উপরে ডেটা বার্তা প্রেরণে আপনি যেখানে ডেটাতে সততার কিছুটা নিশ্চয়তা চান তা ব্যবহার করা হয়।
পাসওয়ার্ডগুলির জন্য হ্যাশগুলিতে একটি নোট:
ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলির একটি মূল বৈশিষ্ট্য হ'ল এগুলি তৈরি করতে খুব দ্রুত হওয়া উচিত, এবং খুব কঠিন / বিপরীত হওয়াতে ধীর হওয়া উচিত (এতটা যে এটি কার্যত অসম্ভব)। এটি পাসওয়ার্ডগুলির সাথে সমস্যা তৈরি করে। আপনি যদি সংরক্ষণ করেন তবে আপনি sha512(password)
রেইনবো টেবিল বা বর্বর বাহিনীর আক্রমণ থেকে রক্ষা করার জন্য কোনও কাজ করছেন না। মনে রাখবেন, হ্যাশ ফাংশনটি গতির জন্য ডিজাইন করা হয়েছিল। সুতরাং আক্রমণকারীর পক্ষে হ্যাশ ফাংশনটির মাধ্যমে একটি অভিধান চালানো এবং প্রতিটি ফলাফল পরীক্ষা করা তুচ্ছ।
লবণ যুক্ত করা বিষয়গুলিকে সহায়তা করে কারণ এটি হ্যাশটিতে কিছুটা অজানা ডেটা যুক্ত করে। সুতরাং মেলে এমন কিছু আবিষ্কার করার পরিবর্তে md5(foo)
, তাদের এমন কিছু সন্ধান করা প্রয়োজন md5(foo.salt)
যা জ্ঞাত লবণের সাথে যুক্ত হয়ে যায় (যা করা খুব বেশি কঠিন)। তবে এটি এখনও গতির সমস্যার সমাধান করতে পারে না কারণ তারা যদি লবণের বিষয়টি জানেন তবে এটি অভিধানটি চালানোর বিষয় মাত্র।
সুতরাং, এটি মোকাবেলার উপায় আছে। একটি জনপ্রিয় পদ্ধতিকে কী শক্তিশালীকরণ (বা কী প্রসারিত) বলা হয়। মূলত, আপনি একটি হ্যাশ দিয়ে বহুবার পুনরাবৃত্তি হন (সাধারণত হাজার হাজার) এটি দুটি কাজ করে। প্রথমত, এটি উল্লেখযোগ্যভাবে হ্যাশিং অ্যালগরিদমের রানটাইমকে ধীর করে দেয়। দ্বিতীয়ত, ডান প্রয়োগ করা হলে (প্রতিটি পুনরাবৃত্তির জন্য ইনপুট এবং লবণের পিছনে প্রবেশ করা) আসলে আউটপুটটির জন্য এনট্রপি (উপলব্ধ স্থান) বৃদ্ধি করে, সংঘর্ষের সম্ভাবনা হ্রাস করে। একটি তুচ্ছ বাস্তবায়ন হল:
var hash = password + salt;
for (var i = 0; i < 5000; i++) {
hash = sha512(hash + password + salt);
}
অন্যান্য, এই ধরনের হিসাবে আরো মান বাস্তবায়নের হয় PBKDF2 , BCrypt । তবে এই কৌশলটি বেশ কয়েকটি সুরক্ষা সম্পর্কিত সিস্টেম (যেমন পিজিপি, ডাব্লুপিএ, অ্যাপাচি এবং ওপেনএসএসএল) ব্যবহার করে।
নীচের লাইন, hash(password)
যথেষ্ট ভাল না। hash(password + salt)
ভাল, তবে এখনও যথেষ্ট ভাল নয় ... আপনার পাসওয়ার্ডের হ্যাশগুলি উত্পাদন করতে একটি প্রসারিত হ্যাশ প্রক্রিয়া ব্যবহার করুন ...
তুচ্ছ স্ট্রেচিংয়ের উপর অন্য একটি নোট
কোনও পরিস্থিতিতে কোনও হ্যাশের আউটপুট সরাসরি হ্যাশ ফাংশনে ফিড করবেন না :
hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
hash = sha512(hash); // <-- Do NOT do this!
}
এর কারণ সংঘর্ষের সাথে সম্পর্কযুক্ত। মনে রাখবেন যে সমস্ত হ্যাশ ফাংশনগুলির সংঘর্ষ রয়েছে কারণ সম্ভাব্য আউটপুট স্পেস (সম্ভাব্য আউটপুটগুলির সংখ্যা) তখন ইনপুট স্পেসের চেয়ে ছোট। কেন তা দেখতে, আসুন কী ঘটে তা দেখুন। এর উপস্থাপনের জন্য, ধরে নেওয়া যাক যে সংঘর্ষের 0.001% সম্ভাবনা রয়েছে sha1()
(এটি বাস্তবে অনেক কম, তবে প্রদর্শনের উদ্দেশ্যে)।
hash1 = sha1(password + salt);
এখন, hash1
0.001% এর সংঘর্ষের সম্ভাবনা রয়েছে। কিন্তু যখন আমরা পরবর্তী কি hash2 = sha1(hash1);
, সব দুর্ঘটনায় hash1
স্বয়ংক্রিয়ভাবে দুর্ঘটনায় হয়েhash2
। সুতরাং এখন, আমাদের কাছে হ্যাশ 1 এর হার 0.001% এ আছে এবং দ্বিতীয় sha1()
কলটি এতে যোগ করে। সুতরাং, এখন hash2
0.002% এর সংঘর্ষের সম্ভাবনা রয়েছে। যে দ্বিগুণ সম্ভাবনা দ্বিগুণ! প্রতিটি পুনরাবৃত্তি 0.001%
ফলাফলের সাথে সংঘর্ষের আরেকটি সুযোগ যুক্ত করবে । সুতরাং, 1000 পুনরাবৃত্তির সাথে, সংঘর্ষের সুযোগটি একটি তুচ্ছ 0.001% থেকে 1% এ চলে গেছে। এখন, অবক্ষয়টি লিনিয়ার, এবং প্রকৃত সম্ভাবনাগুলি অনেক কম, তবে এর প্রভাব একই (একক সংঘর্ষের সম্ভাবনার একটি অনুমান md5
প্রায় 1 / (2 128 ) বা 1 / (3x10 38)। যদিও এটি ছোট মনে হচ্ছে, জন্মদিনের আক্রমণে এটি যতটা ছোট মনে হচ্ছে তেমন ধন্যবাদ নেই )।
পরিবর্তে, প্রতিবার লবণ এবং পাসওয়ার্ড পুনরায় সংযুক্ত করার মাধ্যমে, আপনি হ্যাশ ফাংশনে আবার ডেটা প্রবর্তন করছেন। সুতরাং কোনও নির্দিষ্ট রাউন্ডের যে কোনও সংঘর্ষগুলি পরবর্তী রাউন্ডের আর সংঘর্ষ নয়। তাই:
hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
hash = sha512(hash + password + salt);
}
নেটিভ sha512
ফাংশন হিসাবে সংঘর্ষের একই সুযোগ রয়েছে । যা আপনি চান। পরিবর্তে এটি ব্যবহার করুন।