হ্যাশ (Hash) এবং হ্যাশিং (Hashing)

ক্রিপ্টোগ্রাফী (cryptography), ডাটা এনক্রিপশন (Encryption) এবং ডাটা ইনটেগ্রিটি (integrity) চেকিংয়ের অত্যন্ত গুরুত্বপূর্ণ একটা বিষয় হ্যাশিং। আমাদের প্রতিদিনের কাজের অনেক ক্ষেত্রেই হ্যাশিং ব্যবহার হয়, যেটা অনেকেই হয়তো জানি না। এজন্য আজকে হ্যাশ এবং হ্যাশিং নিয়ে কথা বলবো।

হ্যাশ এবং হ্যাশিং কি?

একটা গল্প দিয়ে জিনিসটা ব্যাখ্যা করি।

রোমিও আর জুলিয়েট (সম্পর্ক ব্যাখ্যা করার কি আর দরকার আছে?)। রোমিওর বাবা খান সাহেব আর জুলিয়েটের বাবা চৌধুরী সাহেব চির দুশমন। দুজনেই তাদের ছেলে মেয়েকে বলে দিয়েছেন একে অপরের সাথে যেনো যোগাযোগ না করে, তাহলে দুজনকেই কেটে নদীতে ভাসিয়ে দেবেন। কিন্তু তারা একজন আরেকজনের সাথে যোগাযোগ না করে কিভাবে থাকবে? রোমিও আর জুলিয়েটের বন্ধু জুলিয়াস সিজার তাদেরকে একটা বুদ্ধি শিখিয়ে দিলো। এই বুদ্ধিতে রোমিও আর জুলিয়েট দুজন দুজনকে পত্র পাঠায়, কিন্তু পত্র পড়লেও খান সাহেব আর চৌধুরী সাহেব কিছুই বুঝতে পারেন না। কেনো বুঝতে পারেন না? বুদ্ধিটা তাহলে বলি।
রোমিও আর জুলিয়েট দুজনেরই প্রিয় সংখ্যা ৩ । এখন তারা দুজন প্রথমে তাদের পত্র সাধারণভাবে একটা কাগজে লেখে। তারপর পত্রের প্রত্যেকটা শব্দের অক্ষরকে বর্ণমালার ক্রমানুসারে ৩ ঘর করে সরিয়ে দেয়। এরকম করে-

তারমানে পত্রে ‘JULIUS CAESAR’ শব্দটি থাকলেও সেটা পরিবর্তিত হয়ে যায় ‘MXOLXV FDHVDU’ শব্দে। তারপর এই পরিবর্তিত পত্রটি তারা পাঠিয়ে দেয় অপরজনের কাছে। এখন মাঝখানে কেউ যদি পত্রটি পড়েও তাহলে তারা বুঝতে পারে না আসলে পত্রটিতে কি লেখা আছে। এভাবে খুব সুন্দর করে তারা তাদের মনের কথা একে অপরের কাছে পাঠাতে শুরু করলো।

গল্পের সাথে আর্টিকেলের টপিকসের কি সম্পর্ক সেটাতে যাওয়ার আগে গল্পের শেষটা বলে নেই।

এভাবে নিয়মিত উলটো পালটা লেখাসহ পত্র দেখে খান সাহেব এবং চৌধুরী সাহেব দুজনই সন্দেহ করেন। তারা আলাদা আলাদাভাবে ডেকে পাঠান বিখ্যাত গণিতজ্ঞ ও ক্রিপ্টোগ্রাফী বিশেষজ্ঞ অ্যালান টুরিং সাহেবকে। টুরিং সাহেব দুই জায়গায় গিয়েই পত্রগুলো দেখেন এবং খুব সহজেই বের করে ফেলেন আসলে কি ঘটছে। তারপর তিনি পত্রগুলোকে আসল পত্রে পরিবর্তিত করে দেন। আসল পত্র পড়ে খান সাহেব এবং চৌধুরী সাহেব দুইজনই ভীষণ চটে যান………………………….।

গল্পের বাকী অংশ আমাদের আর্টিকেলের সাথে প্রাসঙ্গিক না বলে কর্তন করা হলো।

এবার আসি গল্প থেকে আমরা কি শিখলাম।

গল্পে যেই পদ্ধতিতে মূল ম্যাসেজ (পত্র) কে পরিবর্তিত করা হলো এটাকে বলা হয় এনক্রিপশন বা এক্ষেত্রে আমরা এটাকে বলবো হ্যাশিং (যদিও হ্যাশিং আর এনক্রিপশনে কিছুটা পার্থক্য আছে সেটা পরে বলছি) ।
পরিবর্তিত ম্যাসেজটাকে বলে এনক্রিপ্টেড ম্যাসেজ বা হ্যাশ
আমরা যে ৩ ঘর করে অক্ষরগুলোকে সরালাম, মানে আমাদের এনক্রিপশন বা হ্যাশিং মূলত যেটার উপর নির্ভর করে হয়েছে এটাকে বলা হয় ‘কি (key)’। key এর উপর নির্ভর করে এনক্রিপ্টেড ম্যাসেজ বা হ্যাশটা কি হবে। key টা খুবই গুরুত্বপূর্ণ, কারণ key টা যদি এমন হয় যে অনেকগুলো শব্দের জন্য এই key ব্যবহার করে একই হ্যাশ পাওয়া যায় তাহলে সেটা একটা সমস্যা। কারণ এই key টাই ব্যবহার করে আবার ম্যাসেজটাকে ডিক্রিপ্ট (Decrypt) করতে হবে। তখন বের করা যাবে না আসলে কোন শব্দের জন্য এটা এনক্রিপ্ট করা হয়েছিলো। রোমিও জুলিয়েট দুজনই যেহেতু কমন key টা জানতো তাই তারা একজন আরেকজনের পত্র খুব সহজেই পড়তে পারতো। পরে টুরিং সাহেব এসেও এই key টা আন্দাজ করে বের করে ফেলেন বলেই তিনিও পত্রের মর্মোদ্ধার করতে পেরেছেন।

উপরের গল্পটা কাল্পনিক হলেও এনক্রিপশনের এই পদ্ধতিটা কিন্তু সত্যি। আর এই পদ্ধতিটার নাম ‘Caesar Cipher‘, ক্রিপ্টোগ্রাফির একেবারে গোড়ার দিককার এনক্রিপশন মেথড এটা।

আচ্ছা এনক্রিপশন আর হ্যাশিং কি একই জিনিস?

আসলে দুটোর মধ্যে খুব মজার একটা পার্থক্য আছে আর এই পার্থক্যের জন্যই দুটোর ব্যবহারক্ষেত্রেও পরিবর্তন হয়। এনক্রিপশন বলা হয় সেই প্রসেসটাকে যেখানে যেই key ব্যবহার করে এনক্রিপশন করা হয়েছে সেই key ই ব্যবহার করে রিভার্স অর্থাৎ ডিক্রিপ্ট করা যায়, মানে মূল ম্যাসেজ উদ্ধার করা যায়। কিন্তু হ্যাশিং বলতে মূলত বোঝায় one way hashing কে, যেখানে কোনো ডাটাকে এনক্রিপ্ট করা যায় কিন্তু সেটাকে আবার ডিক্রিপ্ট করে মূল ম্যাসেজ বের করা যায় না। এই ডিক্রিপ্ট না করতে পারা দিয়েই একটা হ্যাশিংয়ের সাফল্য বিবেচনা করা হয়।

তাহলে হ্যাশিং করে লাভটা কি হলো যদি আমরা বেরই করতে না পারি কোন জিনিসটাকে হ্যাশিং করলাম?
এটা বোঝানোর জন্য একটা ছোট্ট জিনিস বলি। ধরুন আপনি ফেসবুক বা গুগলের মত সাইটের পাসওয়ার্ড ভুলে গেছেন। আপনি যদি ঐ সাইটের ‘forgot password’ ব্যবহার করেন তারা কি আপনার রিকভারি মেইলে আপনার পাসওয়ার্ডটা পাঠিয়ে দেয়? না দেয় না। তারা কি করে? তারা মেইলে একটা লিমিটেড টাইম টোকেন লিংক পাঠায় যেটা দিয়ে আপনি নতুন করে পাসওয়ার্ড সেট করে নিতে পারেন। কিন্তু তারা এত ঝামেলা না করে ডাটাবেজ থেকে আপনার পাসওয়ার্ড পাঠালো না কেন? কারণ তারা ডাটাবেজে আপনার পাসওয়ার্ডটা ‘plain text’ হিসেবে সেভই করে রাখে না, অর্থাৎ আপনার পাসওয়ার্ড যদি হয় ‘1234’, ডাটাবেজে এটা এভাবে থাকবে না। আপনার পাসওয়ার্ডটাকে one way hashing করে পাসওয়ার্ডের Hash value টা রাখা হয়, যেমন আপনার পাসওয়ার্ডকে যদি SHA-1 (একটা হ্যাশিং মেথড) দিয়ে হ্যাশিং করা হয় তাহলে হ্যাশ ভ্যালু হবে ‘7110eda4d09e062aa5e4a390b0a572ac0d2c0220’, ডাটাবেজে এরকম কিছু একটাই রাখা হয়। সেই Hash value থেকে কেউ আপনার আসল পাসওয়ার্ড ‘1234’ বের করতে পারবে না, এমনকি গুগল ফেসবুকের ইঞ্জিনিয়াররাও না, হ্যাকাররাও না। তাতে লাভটা কি হলো, কেউ যদি ডাটাবেজের ডাটাগুলো দেখেও তারা ব্যবহারকারীদের পাসওয়ার্ড কি সেটা বের করতে পারবে না। এখন নিশ্চয়ই ভাবছেন তাহলে আপনি যখন লগিন করার জন্য পাসওয়ার্ড দেন তাহলে কিভাবে সেটা ম্যাচ করে? খুব সহজ, আপনার দেয়া পাসওয়ার্ডটাকে আবার একইরকমভাবে হ্যাশিং করা হয়, তারপর ডাটাবেজে রাখা হ্যাশ ভ্যালু আর এই হ্যাশভ্যালু ম্যাচ করা হয়। যদি মিলে যায় তাহলে পাসওয়ার্ড ঠিক আছে, নাহলে না। যেহেতু একই ডাটার জন্য একই হ্যাশিং মেথডে সবসময় একই হ্যাশ ভ্যালু জেনারেট হবে, সুতরাং এ পদ্ধতি ঠিকভাবেই কাজ করবে। একই হ্যাশিং মেথডে একই ডাটার সবসময় একই হ্যাশ ভ্যালু জেনারেট হওয়া ক্রিপ্টোগ্রাফিক হ্যাশিংয়ের গুরত্বপূর্ণ বৈশিষ্ট্য।

পাসওয়ার্ডের এ ব্যাপারটা ছাড়াও অনেকেই হয়তো খেয়াল করেছেন যখন কোনো সফটওয়্যার বা কোনো ফাইল ডাউনলোড করেন তখন সেখানে কখনো কখনো ‘checksum value’ নামে একটা হ্যাশ ভ্যালু দেয়া থাকে। কেনো দেয়া থাকে জানেন? আপনার ডাউনলোড করা সফটওয়্যার বা ফাইল এর যদি আপনি হ্যাশ ভ্যালু বের করেন (হ্যাশভ্যালু ক্যালকুলেট করার এরকম সফটওয়্যার নেটে পাওয়া যায়) তাহলে সেই হ্যাশ ভ্যালুর সাথে সার্ভারের দেয়া হ্যাশ ভ্যালু আপনি মিলিয়ে দেখতে পারেন। যদি পুরোপুরি মিলে যায় তাহলে আপনার ডাউনলোড করার ফাইলটি করাপ্টেড না বা কোনো ভাবে এটার ডাটার ইনটেগ্রিটি নষ্ট হয় নি। এই জন্যই ঐ হ্যাশ ভ্যালুটি (সাধারণত MD5 hash) দেয়া থাকে।

কিভাবে আসলেই হ্যাশিং দিয়ে ডাটার ইনটেগ্রিটি চেক করা যায় সেটার জন্য এ ভিডিওটা দেখতে পারেন-

এখানে দেখতে পাবেন কিভাবে অত্যন্ত ক্ষুদ্র পরিবর্তনেও হ্যাশ ভ্যালু সম্পূর্ণ পরিবর্তন হয়ে যায়। অর্থাৎ পরিবর্তনের উপর ভিত্তি করে আপনি হ্যাশিংয়ের কোনো প্যাটার্ণ বের করতে পারবেন না। কারণ তাহলে তো হ্যাশিং ব্রেক করা খুবই সহজ হয়ে যেতো।

জনপ্রিয় কয়েকটি হ্যাশিং মেথড হচ্ছে SHA-0, SHA-1, SHA-2, MD5 ইত্যাদি।

এতগুলো হ্যাশিং মেথড কেনো, কেনো একটাই ইউনিভার্সাল হ্যাশিং মেথড নেই? কারণ প্রত্যেকটা হ্যাশিং মেথডই দাবী করে এগুলো আনব্রেকেবল (unbreakable), কিন্তু তারপরও কিছু কিছু মেথড ইতিমধ্যে ব্রেক করার পদ্ধতি বের হয়ে গেছে। একারণেই নতুন নতুন আরো শক্তিশালী এবং দক্ষ হ্যাশিং মেথড বের করার গবেষণা চলছে।

আচ্ছা তাহলে এনক্রিপশন কোথায় ব্যবহার হয়? আপনি যদি লক্ষ্য করেন তাহলে দেখবেন আমাদের আগে থেকে সংরক্ষিত কোনো একটা ডাটার সাথে আমরা পরে একই ডাটা ম্যাচ করার জন্য হ্যাশিং ব্যবহার করছি। অর্থাৎ Data integrity checking এর জন্য হ্যাশ ব্যবহার করছি। কিন্তু যদি শুধুমাত্র এক জায়গা থেকে ডাটা আরেক জায়গায় পাঠানোর ক্ষেত্রে মাঝপথে ডাটার সিকিউরিটিটাই মূখ্য হয় (যেমন: http+ssl ব্যবহার করে আপনার ব্রাউজার থেকে সিকিউরড পিন কোড, পাসওয়ার্ড সার্ভারে পাঠানোর সময়) এসব ক্ষেত্রে এনক্রিপশন ব্যবহার করা হয়। মানে আপনার যদি এনক্রিপটেড ডাটা থেকেই আবার মূল ম্যাসেজ ফিরে পাওয়ার দরকার পড়ে তখন এনক্রিপশন দরকার পড়বে। তারমানে এনক্রিপশন, হ্যাশিং যখন যেখানে যেটা দরকার সেখানে সেটা ব্যবহার করা হয়।

এখানে আরেকটা টার্ম জেনে রাখা ভালো যেটা কাজে লাগতে পারে। হ্যাশিং যদিও এমনতেই যথেষ্ট সিকিউরড এবং ইর্রিভার্সিবল(Irreversible)। তারপরও এটাকে আরেকটু হার্ড করার জন্য হ্যাশ ভ্যালুর সাথে একটা র‍্যান্ডম ডাটা (যেমন ফেসবুকের ক্ষেত্রে হতে পারে ইউজারের User ID) যুক্ত করে তারপর সেটাকে রাখা হয়। এই র‍্যান্ডম ডাটাকে বলা হয় ‘Salt’। এটার মাধ্যমে হ্যাশিংকে আরো শক্তিশালী করা হয়। কারণ ধরুন কেউ আপনার পাসওয়ার্ড কি সেটা আন্দাজ করে হ্যাশ তৈরি করে করে ডাটাবেজের হ্যাশ ভ্যালুর সাথে মেলানোর চেষ্টা করছে। এখন ডাটাবেজের হ্যাশভ্যালুতে যদি পাসওয়ার্ডের হ্যাশ ভ্যালুর সাথে ‘salt’ ও যোগ করা থাকে তাহলে অ্যাটাকারের পক্ষে তো সেই ‘salt’ ভ্যালু আন্দাজ করে বের করা অনেকবেশি কঠিন হয়ে গেলো।

ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন নিয়ে বেশ সুন্দর ও সহজবোধ্য একটা আর্টিকেল পাওয়া যাবে এখানে

--

--