প্রোগ্রামিং এ Hashing হলো অনেকটা আলু ভর্তা বানানোর মতো। কোন ডেটা, পাসওয়ার্ড, বা ফাইলকে হ্যাশ করে তার একটি ভর্তা বানানো হয়।
উদাহরণ-
“1234” -> 81dc9bdb52d04dc20036dbd8313ed055
১) Hashing একটি one-way অপারেশন। একটি আলুকে একবার ভর্তা বানালে সেটা যেমন আবার আগের আলুর রূপে ফেরত আসে না (Practically) ঠিক তেমনি কোন ডেটাকে একবার Hash এ কনভার্ট করলে সেটা আগের রূপে ফেরত আনা যায় না।
আমরা যখন কোন সফটওয়্যার বানাই, তখন ইউজারের পাসওয়ার্ড এই রকম plaintext (যেমন 1234) এ সেভ করে রাখলে সেই ডেটাবেজ নিয়ে নাড়াচাড়া করা অনেক বিপদজনক হয়ে পরে। যেকোন সময় ডেটা লিক, বা হ্যাকার যদি ডেটা চুরি করে ফেলে তাহলে সব ইউজারের পাসওয়ার্ড ফাঁস হয়ে যাবে।
তাই পাসওয়ার্ডগুলো সাধারণত এরকম hashing করে সেভ করে রাখা হয়। হ্যাকার যদি এই ভর্তা গুলো চুরি করে ফেলে, তাহলে সে কখনোই সেই ভর্তা থেকে আসল আলু বানাতে পারবে না, মানে আগের পাসওয়ার্ডটি বানাতে পারবে না।
২) Hashing algorithm গুলো deterministic হয়ে থাকে। এর মানে হলো, একটি ডেটাকে কোন একটি algorithm দিয়ে hash করলে সব সময় একই ভ্যালু বের হবে।
অর্থাৎ 1234 –এই পাসওয়ার্ডটিকে MD5 হ্যাশিং এলগোরিদম দিয়ে হ্যাশ করলে সবসময় এর ভ্যালু এটাই বের হবে- 81dc9bdb52d04dc20036dbd8313ed055
আমাকে কখনোই ইউজারের পাসওয়ার্ড 1234 সেভ করে রিস্ক নিতে হবে না। সে যখন আবার এই পাসওয়ার্ড এন্টার করবে, আমি আবার হ্যাশ করে আমার ডেটাবেজে সেভ করা হ্যাশের সাথে মিলিয়ে দেখবো। দুটি হ্যাশ মিলে গেলেই বুঝবো তার পাসওয়ার্ড সঠিক।
কিন্তু এখানে একটি বড় রকমের ঝুঁকি আছে।
যদি দুইজন ইউজার একই পাসওয়ার্ড সেট করে, তাহলে তাদের দুইজনের হ্যাশ সেইম হবে তাই না?
1234 এর মত দশ লক্ষ কমন পাসওয়ার্ড আছে যেগুলো হ্যাকাররা আগে থেকে হ্যাশ করে একটি ডেটাবেজ বানিয়ে রেখেছে।
এখন হ্যাকার যদি একটি ডেটাবেজ চুরি করে ফেলে, তখন তার জাস্ট এই হ্যাশ গুলো মিলিয়ে দেখলেই হবে। যদি কোন হ্যাশ ভ্যালু 81dc9bdb52d04dc20036dbd8313ed055 হয়, তার মানে এর পাসওয়ার্ড হলো 1234
৩) দুজন ইউজার যদি একই পাসওয়ার্ড সেট করে, তাহলে যেন তাদের হ্যাশ ভ্যালু একই না হয়ে যায়, তাই এখানে Salt ইউজ করা হয়। দুটি একই রকম আলুতে যদি দুই পরিমাণ লবণ দেওয়া হয়, তাহলে দুটি ভর্তাই আলাদা হবে। এখান আমার প্রোগ্রাম প্রথম ইউজারের ডেটা নিবে, তারপর সেই ডেটাকে হ্যাশ না করে, একটি random salt জেনারেট করে সেখানে এড করবে। এইবার সেই ডেটা আর salt একসাথে হ্যাশ করবে। ফলাফল দুইজন যদি একই পাসওয়ার্ড 1234 সাবমিট করে, তাদের salt ভ্যালু আলাদা হবার কারণে হ্যাশটিও আলাদা হবে।
এই salt ভ্যালুটি ডাটাবেজ হ্যাশের সাথে সেভ করে রাখা হয়। হ্যাকার যদি salt সহ হ্যাশগুলো চুরি করে ফেলে তারপরেও তার প্রত্যেকটি পাসওয়ার্ড ক্র্যাক করার জন্য আলাদা করে খাটতে হবে।
৪) এই হ্যাশিংকে আরেকধাপে সিকিউর করার জন্য pepper বা মরিচ ইউজ করা হয়। আলু ভর্তায় লবণ দিলাম, এবার যদি আমার পছন্দের কাচা মরিচ এড করি, তাহলে এমন এক ইউনিক ভর্তা হবে, যেটা অন্য কোন ভর্তার সাথে মিলবে না।
এই pepper আরেকটি পাসওয়ার্ড বা সিক্রেট কোড যা আমার প্রোগ্রামের কনফিগারেশনে সেভ করা থাকে। এবার যখন ইউজার নতুন পাসওয়ার্ড সেট করবে তখন এভাবে হ্যাশ জেনারেট হবে-
ইউজারের টাইপ করা পাসওয়ার্ড + Random Salt + Developer Pepper
= Hash value
এর সুবিধা হলো, হ্যাকার যদি salt সহ ডেটাবেজ চুরি করে ফেলে, তাহলেও সে pepper পাচ্ছে না। যার ফলে পাসওয়ার্ড ক্র্যাক করা আরো কঠিন হয়ে যাবে।
কয়েকটি জনপ্রিয় হ্যাশিং এলগোরিদম-
MD5
SHA1
SHA256
সতর্কতাঃ- নতুন লার্নারদের বোঝার সুবিধার জন্য এখানে MD5 হ্যাশিং এলগোরিদম এর কথা উল্লেখ করেছি। প্র্যাকটিকালি MD5 দিয়ে কোন পাসওয়ার্ড বা সেনসেটিভ ডেটা সিকিউর করা আর রেকমেন্ডেড না কারণ ২০০০ সালের দিকেই এই এলগরিদমটি ক্র্যাক করে ফেলা হয়েছে।
পাসওয়ার্ড হ্যাশ করার জন্য বর্তমানে যেসব এলগোরিদম ইউজ হয় সেগুলো হলো-
bcrypt
scrypt

