ডাটা নিয়ে কাজ করতে গেলে এবং তার সুরক্ষা নিশ্চিত করতে গেলে দু'টো শব্দ আমরা কম-বেশী সবাই শুনে থাকি একটি হল হ্যাশ (Hash) এবং এনক্রিপশন (Encryption)।
হ্যাশ
হ্যাশ হল ডাটা সুরক্ষার জন্য ক্রিপ্টোগ্রাফী (cryptography) এর একটি টেকনিক যা ব্যবহার করে আমরা আমাদের ডাটাকে গোপনীয়তার সহিত সুরক্ষার জন্য এর স্ট্যাকচার পরিবর্তন করে থাকি , বিভিন্ন অ্যালগরিদম ব্যবহার করে (md5, sha256 ইত্যাদি) এটা করি । ফলে মূল ডাটাটি দেখতে কিরকম ছিল তা বুঝার উপায় থাকে না। ডাটাকে এই পদ্ধতিতে হ্যাশ করা প্রকিয়াকে আমরা হ্যাশিং বলব।
হ্যাশিং পদ্ধতি ব্যবহার করে কোন ডাটাকে একবার হ্যাশ করে পরিবর্তন করা হলে তা আর মূল ডাটাতে রুপান্তর করা সম্ভব হয় না। কারণ হ্যাশ ফাংশন ব্যবহার করে আপনি যত বড় বা ছোট ইনপুকে হ্যাশ করেন না কেন এটি সবসময় Fixed-length signature তৈরী করে । যেমন md5 অ্যালগরিদম ব্যবহার করলে আপনি যে কোন ইনপুটের জন্য 32 ক্যারেক্টার আউটপুট পাবেন, sha256 ব্যবহার করলে 64 ক্যারেক্টার আউটপুট পাবেন। উদাহারণ দিয়ে বলি-
1 কে md5 ব্যবহার করে যদি হ্যাশ করলে আউটপুন হবে c4ca4238a0b923820dcc509a6f75849b যেটি ৩২ ক্যারেক্টারের একটি স্টিং।
12345 কে md5 দিয়ে হ্যাশ করলেও ৩২ ক্যারেক্টারের আউটপুট হবে 827ccb0eea8a706c4c34a16891f84e7b
I love Bangladesh কে md5 দিয়ে হ্যাশ করলেও ৩২ ক্যারেক্টারের আউটপুট হবে 73f077f68d709f170eafb8b347be3932
আপনিও টেস্ট করে দেখতে পারেন এইখান থেকে http://www.sha1-online.com/
মজার বিষয় হল হ্যাশ করা ডাটা পূনরায় পূর্বের অবস্থায় ফিরে পাওয়া যায় না ঠিকই কিন্তু দু'টো হ্যাশ স্টিং কে ম্যাচিং করা যাবে। মনে করেন আপনার কাছে আগে থেকে একটি হ্যাশ করা স্টিং আছে 827ccb0eea8a706c4c34a16891f84e7b এখন যদি আপনি 12345 কে md5 দিয়ে হ্যাশ করেন দেখবেন একই হ্যাশ আসবে, হ্যাশকৃত স্টিংটি আগের হ্যাশটির সাথে ম্যাচ হবে। এই পদ্ধতি আমরা ইউজার লগিন সিস্টেমে ব্যবহার করে থাকি। যেখানে ব্যবহারকারীর পাসওয়ার্ডগুলো সিকিউরিটির জন্য হ্যাশ করা থাকে ডাটাবেসে যাথে কেউ ডাটাবেসে ডুকলেও পাসওয়ার্ডগুলো কি তা জানতে না পারে।
এনক্রিপশন (Encryption)
এনক্রিপশনও ক্রিপ্টোগ্রাফী (cryptography) এ ডাটাকে গোপনীয়তার সাথে সুরক্ষিত রাখার একটি টেকনিক। এই পদ্ধতিতে আপনি যেভাবে ডাটাকে এনক্রিপ্ট করে পরিবর্তন করবেন ঠিক তার উল্টাটি (রিভার্স) করলে ডাটাকে আবার পূর্বের অবস্থায় ফিরে পাবেন। যেটি হ্যাশিং এ সম্ভব না। Encryption নিয়ে অনেক আলোচনা আছে, এখানে শুধুমাত্র কন্সেপ্টটি পরিস্কার ও ব্যবহার ক্ষেত্র তুলে ধরা হয়েছে।
যেমন- 12345 কে এনক্রিপ্ট করে যে আউটপুট পাবেন তাকে আবার decrypt করলে আবার 12345 ফিরে পাওয়া যায়।
হ্যাশ-এনক্রিপশন কোনটি কেন ও কখন ব্যবহার করবেন
হ্যাশ ব্যবহার করবেন খুব-ই সেনসেটিভ ডাটার ক্ষেত্রে যাতে রিভার্স করা সম্ভব না হয়। সাধারণত আমরা ইউজার লগিন সিস্টেমে পাসওয়ার্ডকে হ্যাশ করে রাখি যাতে কেউ কারো পাসওয়ার্ড ডাটাবেসে ডুকেও যাতে জানতে না পারে। আমরা শুধুমাত্র ব্যবহারকারী দেয়া পাওয়ার্ড কে হ্যাশ করে ডাটাবেসের হ্যাশ এর সাথে মিললে থাকে সিস্টেমে টুকতে দিই। পেমেন্ট সিস্টেমের ইউজারদের কার্ড ডিটেইলস ও খুবই সেনসেটিভ ডাটা তাই এই ডাটাগুলোকেও হ্যাশ করে রাখা হয় যাতে অন্যকেউ জানতে না পারে। অন্যদিকে এমন ডাটাকে আমরা এনক্রিপ্ট করব যেগুলো আমাদের পরবর্তীতে জানার দরকার হতে পারে। যেমন আমরা হোয়ার্টঅ্যাপে এ end to end cncryption এ ম্যাসেজিং করে থাকি। কোন ইউজার একটি ম্যাসেজ দিলে তা এনক্রিপ্ট হয়ে নেটওয়ার্ক এর মাধ্যমে অন্য ইউজারের কাছে যায় ফলে নেটওয়ার্ক এর মধ্যখানে কেউ সেই এনক্রিপ্টেট ম্যাসেজটি দেখলেও ডিক্রিপ্ট করতে পারে না কারণ তার কাছে ডিক্রিপ্ট করার কী (key) টি থাকে না, এটি শুধুমাত্র যে ইউজারের কাছে পাঠানো হয়েছে তার কাছে পৌছানোর পর key এর মাধ্যমে ডিক্রিপ্ট হয়ে আসল ম্যাসেজটি দেখতে পায়।
বিবর্তন
তথ্য আদান-প্রদানে তথ্যের কোনরকম বিকৃতি ঘটল কিনা সেটা যাচাই করা হয় এই ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনের মাধ্যমে। জনপ্রিয় মেসেজ ডাইজেস্ট (Message Digest) অ্যালগোরিদমের অন্তর্ভুক্ত তিনটি অ্যালগোরিদম - MD2, MD4, এবং MD5। এই তিনটি এলগোরিদমই আবিষ্কার করেছেন Ronald Rivest।
তিনি MD2 উদ্ভাবন করেছেন ১৯৮৯ সালে, MD4 উদ্ভাবন করেছেন ১৯৯০ সালে ও MD5 উদ্ভাবন করেছেন ১৯৯১ সালে।
তিনটি মেসেজ ডাইজেস্ট অ্যালগোরিদমের ক্ষেত্রেই মেসেজ ডাইজেস্ট হয় ১২৮ বিটের অর্থাৎ বিভিন্ন দৈর্ঘ্যের তথ্য নিয়ে মেসেজ ডাইজেস্ট হ্যাশিং এলগোরিদমের মাধ্যমে ১২৮ বিটের একটি স্থায়ী হ্যাশিং ভ্যালু বের করা হয়। একটি ১২৮বিট নাম্বার থেকে ২^১২৮ বা ৩.৪X১০^৩৮ টি সম্ভাব্য ভ্যালু পাওয়া যাবে অর্থাৎ ৩৪০,২৮২,৩৬৬,৯২০,৯৩৮,৪৬৩,৪৬৩,৩৭৪,৬০৭,৪৩১,৭৬৮,২১১,৪৫৬ গুলি সম্ভাব্য ভ্যালু। অর্থাৎ ব্রুটফোর্স অ্যাটাকের মাধ্যমে হ্যাশভ্যালুটি বের করতে চাইলে ২^১২৮ বার চেষ্টা করতে হবে।
Message Digest by Steve Friedl (১) MD2 তৈরি করা হয়েছিল ৮-বিট মেশিনের জন্য ও MD4, MD5 তৈরি করা হয়েছিল ৩২-বিট মেশিনের জন্য। কিন্তু কোনটিই শেষ পর্যন্ত নিরাপদ হয় নি।
একটির নিরাপত্তা ভেঙ্গে যাওয়ার সাথে সাথে পর্যায়ক্রমে আরেকটি হ্যাশিং অ্যালগোরিদম আবিষ্কৃত হয়েছে। বিভিন্ন রকমের আক্রমণ ছাড়াও সবগুলিই বিশেষ করে Collision Attack-এর সম্মুখীন হয়েছে।
Collision Attack
যখন বিভিন্ন রকম তথ্য থেকে একই হ্যাশ ভ্যালু পাওয়া যায়, তাই collision হিসেবে পরিচিত। ১২৮-বিটের নাম্বারের একটি হ্যাশভ্যালু থেকে তথ্যটি উদ্ধার করা খুবই কঠিন। তাই হ্যাকারদল অন্য একটি পদ্ধতি অর্থাৎ Collision attack শুরু করে দিল।
আমরা জানি আমাদের তথ্য-ইনপুট দুটি অর্থাৎ প্রথম ইনপুটের হ্যাশভ্যালু নির্ধারণ করে সংরক্ষণ করা হয়, আর দ্বিতীয় ইনপুট পরবর্তীতে ব্যবহারকারীর কাছ থেকে নিয়ে হ্যাশভ্যালু নির্ধারণ করে সংরক্ষিত হ্যাশভ্যালুর সাথে মেলানো হয়। মেসেজ ডাইজেস্ট-এ দেখা গেল, ইনপুট যাই হোক না কেন, একাধিক ইনপুটের একই হ্যাশভ্যালু পাওয়া যায়। অর্থাৎ এক্ষেত্রে হ্যাকারকে এমন একটি ইনপুট বের করতে হবে (আগের দেওয়া ইনপুটের সাথে না মিললেও চলবে) যা নাকি একই হ্যাশভ্যালু জেনারেট করবে। উদাহরণটি এমন হতে পারে, আমাদের আগের সংরক্ষণ করা জন্মতারিখ ১০ ই অক্টোবর ১৯৯০ ছাড়াও আরো এমন একটি জন্মতারিখ বের করতে হবে যা নাকি একই হ্যাশভ্যালু তৈরি (generate) করবে। তাহলেই কেল্লাফতে কারণ জন্মতারিখ ভিন্ন হলেও হ্যাশভ্যালু একই হলে কার্ড এক্টিভেট করে ফেলা যাবে।
যদিও ব্যাপারটি একেবারেই সহজ নয় কারণ সংখ্যাটি ১২৮ বিটের। যাই হোক, ২০০৯ সালে Tao Xie এবং Dengguo Feng মিলে একটি পেপার লিখলেন যে collision attack-এর মাধ্যমে MD5 ব্রেক করা যাবে এবং এতে প্রয়োজন হবে ২৬৪ টি সাইকেল-এর। পরবর্তীতে একই বছরে ২২০.৯৬ টি সাইকেলের মাধ্যমেই MD5 ব্রেক করা সম্ভব হয়েছিল।
১৯৯৫ সালে US National Security Agency (NSA) নিয়ে আসে SHA-1। SHA হল Secure Hah Algorithm-এর সংক্ষিপ্ত-রূপ। এক্ষেত্রে হ্যাশভালু তৈরি করা হয় ১৬০-বিটের যেখানে আগের মেসেজ ডাইজেস্ট ছিল ১২৮-বিটের। ১৬০-বিটের SHA-1 ভ্যালু তৈরি করতে প্রয়োজন হয় ৮০ রাউন্ড ব্লক অপারেশনের যেখানে MD5 এর ক্ষেত্রে প্রয়োজন হত মাত্র ৪ রাউন্ড ব্লক অপারেশনের।SHA-1এর আগে অবশ্য SHA-0 তৈরি করা হয়েছিল ১৯৯৩ সালে এবং কিছুদিনের মধ্যেই SHA-1 নিয়ে আসা হয়।
২০০৫ সালে প্রথম Rijmen ও Oswald প্রথমে SHA-1-এর collision attack-এর সম্পর্কে তাদের গবেষণাপত্র প্রকাশ করেন। একই বছর আরো অনেকেই SHA-1-এর উপর collision attack-এর কথা ঘোষণা করেন। একটি SHA-1-এর উদাহরণ SHA1("The quick brown fox jumps over the lazy dog") = 2fd4e1c6 7a2d28fc ed849ee1 bb76e739 1b93eb12 (wikipedia)
ইউএস ন্যাশনাল সিকিউরিটি এজেন্সি (NSA) নিয়ে আসে SHA-2 এবং NIST কর্তৃক এটা প্রকাশিত হয় ২০০১ সালে।নিয়মানুযায়ী এটির হ্যাশভ্যালুর দৈর্ঘ্য আগের চেয়ে বাড়ানো হয়। তবে এটিকে শুধুমাত্র একটি হ্যাশ ফাংশন না বলে SHA-2 পরিবার বলা যেতে পারে কারণ এক্ষেত্রে ভিন্ন ভিন্ন চার ধরণের হ্যাশভ্যালু নির্ধারণ করা যাবে।
এই SHA-2 পরিবারটির অন্তর্ভুক্ত হ্যাশ অ্যালগোরিদমগুলো হচ্ছে SHA-224, SHA-256, SHA-384, SHA-512। নাম দেখেই বোঝা যাচ্ছে যে এগুলো আসলে বিভিন্ন দৈর্ঘ্যের হ্যাশভ্যালু তৈরি করে। US সরকারের কিছু কিছু অ্যাপ্লিকেশনে SHA-1 ও SHA-2-এর ব্যবহার আইন দ্বারা ব্যবহার বাধ্যতামূলক করা হয়েছে। এছাড়া বিভিন্ন রকম অ্যাপ্লিকেশন ও প্রটোকল যেমন TLS, SSL, PGP, S/MIME, IPSec-এ SHA-2 হ্যাশ ফাংশন ব্যবহার করা হয়ে থাকে।
SHA-3
SHA-3 is a subset of the broader cryptographic primitive family Keccak (),[6][7] designed by Guido Bertoni, Joan Daemen, Michaël Peeters, and Gilles Van Assche, building upon RadioGatún. Keccak's authors have proposed additional uses for the function, not (yet) standardized by NIST, including a stream cipher, an authenticated encryption system, a "tree" hashing scheme for faster hashing on certain architectures,[8][9] and AEAD ciphers Keyak and Ketje
Keccak এর ব্যতিক্রমধর্মী যে বৈশিষ্ট্য সেটি হল, Keccak ভ্যারিয়েবল লেন্থের হ্যাশভ্যালু তৈরি করতে পারবে। এক্ষেত্রে বলা হয়েছে যে, এটি আলাদা একটি পদ্ধতি sponge strategy/construction ব্যবহার করার ফলে যেকোনো ধরণের generic আক্রমণকে এটা প্রতিহত করতে সক্ষম হবে।Keccak যারা তৈরি করেন তারা হচ্ছেন Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche।
The most reliable, safe and efficient password hashing algorithm in 2018
- Argon2 is the winner of the password hashing competition and should be considered as first choice for new applications;
- PBKDF2 when FIPS certification or enterprise support on many platforms is required;
- scrypt where resisting any/all hardware accelerated attacks is necessary but support isn’t.
- bcrypt where PBKDF2 or scrypt support is not available And Popular and best php Laravel Framework use bcrypt for password encryption.