প্রোগ্রামিং এ Hashing হলো অনেকটা আলু ভর্তা বানানোর মতো। কোন ডেটা, পাসওয়ার্ড, বা ফাইলকে হ্যাশ করে তার একটি ভর্তা বানানো হয়।
উদাহরণ-
“1234” -> 81dc9bdb52d04dc20036dbd8313ed055
ইনপুট হিসেবে 1234 -এই স্ট্রিং টি দিলে, MD5 নামের একটি হ্যাশিং ফাংশন তাকে এই ভ্যালুতে কনভার্ট করবে। আপনি চাইলে নিজেই এই অনলাইন হ্যাশ জেনারেটর দিয়ে চেক করে দেখতে পারবেনঃ-

একটি আলুকে একবার ভর্তা বানালে সেটা যেমন আবার আগের আলুর রূপে ফেরত আসে না (Practically) ঠিক তেমনি কোন ডেটাকে একবার Hash এ কনভার্ট করলে সেটা আগের রূপে ফেরত আনা যায় না।
আমরা যখন কোন সফটওয়্যার বানাই, তখন ইউজারের পাসওয়ার্ড এই রকম plaintext (যেমন 1234) এ সেভ করে রাখলে সেই ডেটাবেজ নিয়ে নাড়াচাড়া করা অনেক বিপদজনক হয়ে পরে।
| username | password |
| tamal | 1234 |
যেকোন সময় ডেটা লিক, বা হ্যাকার যদি ডেটা চুরি করে ফেলে তাহলে সব ইউজারের পাসওয়ার্ড ফাঁস হয়ে যাবে।
তাই পাসওয়ার্ডগুলো সাধারণত এরকম hashing করে সেভ করে রাখা হয়।
| username | hash |
| tamal | 81dc9bdb52d04dc20036dbd8313ed055 |
হ্যাকার যদি এই ভর্তা গুলো চুরি করে ফেলে, তাহলে সে কখনোই সেই ভর্তা থেকে আসল আলু বানাতে পারবে না, মানে আগের পাসওয়ার্ডটি বানাতে পারবে না।
এর মানে হলো, একটি ডেটাকে কোন একটি algorithm দিয়ে hash করলে সব সময় একই ভ্যালু বের হবে।
অর্থাৎ 1234 –এই পাসওয়ার্ডটিকে MD5 হ্যাশিং এলগোরিদম দিয়ে হ্যাশ করলে সবসময় এর ভ্যালু এটাই বের হবে- 81dc9bdb52d04dc20036dbd8313ed055
আমাকে কখনোই ইউজারের পাসওয়ার্ড 1234 সেভ করে রিস্ক নিতে হবে না। সে যখন আবার এই পাসওয়ার্ড এন্টার করবে, আমি আবার হ্যাশ করে আমার ডেটাবেজে সেভ করা হ্যাশের সাথে মিলিয়ে দেখবো। দুটি হ্যাশ মিলে গেলেই বুঝবো তার পাসওয়ার্ড সঠিক।
username = input("Enter your username:")
user_password = input("Enter your password:")
input_hash_value = generate_hash(user_password)
database_hash_value = get_hash_from_db(username)
if(input_hash_value == database_hash_value):
# Welcome to your dashboard
else:
# Incorrect username or passwordCode language: Python (python)
কিন্তু এখানে একটি বড় রকমের ঝুঁকি আছে।
যদি দুইজন ইউজার একই পাসওয়ার্ড সেট করে, তাহলে তাদের দুইজনের হ্যাশ সেইম হবে তাই না?
| username | hash |
| tamal | 81dc9bdb52d04dc20036dbd8313ed055 |
| tarina | 81dc9bdb52d04dc20036dbd8313ed055 |
1234 এর মত দশ লক্ষ কমন পাসওয়ার্ড আছে যেগুলো হ্যাকাররা আগে থেকে হ্যাশ করে একটি ডেটাবেজ বানিয়ে রেখেছে।
এখন হ্যাকার যদি একটি ডেটাবেজ চুরি করে ফেলে, তখন তার জাস্ট এই হ্যাশ গুলো মিলিয়ে দেখলেই হবে। যদি কোন হ্যাশ ভ্যালু 81dc9bdb52d04dc20036dbd8313ed055 হয়, তার মানে এর পাসওয়ার্ড হলো 1234
দুজন ইউজার যদি একই পাসওয়ার্ড সেট করে, তাহলে যেন তাদের হ্যাশ ভ্যালু একই না হয়ে যায়, তাই এখানে Salt ইউজ করা হয়। দুটি একই রকম আলুতে যদি দুই পরিমাণ লবণ দেওয়া হয়, তাহলে দুটি ভর্তাই আলাদা হবে।
এখানে আমার প্রোগ্রাম প্রথমে ইউজারের ডেটা নিবে, তারপর সেই ডেটাকে হ্যাশ না করে, একটি random salt জেনারেট করে সেখানে এড করবে। এইবার সেই ডেটা আর salt একসাথে হ্যাশ করবে।
input_password = input("Set your password:")
salt = "32 char random hex generated string"
salted = input_password + salt
hashed = hash_function(salted)Code language: Python (python)
ফলাফল: দুইজন যদি একই পাসওয়ার্ড 1234 সাবমিট করে, তাদের salt ভ্যালু আলাদা হবার কারণে হ্যাশটিও আলাদা হবে।
| username | salt | hash |
| tamal | abc | 64ad3fb166ddb41a2ca24f1803b8b722 |
| tarina | xyz | a4eb2e0f3e0cbac5c3e64ddc4d24f1df |
এই salt ভ্যালুটি ডাটাবেজ হ্যাশের সাথে সেভ করে রাখা হয়। হ্যাকার যদি salt সহ হ্যাশগুলো চুরি করে ফেলে তারপরেও তার প্রত্যেকটি পাসওয়ার্ড ক্র্যাক করার জন্য আলাদা করে খাটতে হবে।
এই হ্যাশিংকে আরেকধাপে সিকিউর করার জন্য pepper বা মরিচ ইউজ করা হয়। আলু ভর্তায় লবণ দিলাম, এবার যদি আমার পছন্দের কাচা মরিচ এড করি, তাহলে এমন এক ইউনিক ভর্তা হবে, যেটা অন্য কোন ভর্তার সাথে মিলবে না।
এই pepper আরেকটি পাসওয়ার্ড বা সিক্রেট কোড যা আমার প্রোগ্রামের কনফিগারেশনে সেভ করা থাকে। এবার যখন ইউজার নতুন পাসওয়ার্ড সেট করবে তখন এভাবে হ্যাশ জেনারেট হবে-
ইউজারের টাইপ করা পাসওয়ার্ড + Random Salt + Developer Pepper
= Hash value
input_password = input("Set your password:")
salt = "32 char random hex generated string"
pepper = os.environ.get("APP_SECRET")
pepper_and_salted = input_password + salt + pepper
hashed = hash_function(pepper_and_salted)Code language: Python (python)
এর সুবিধা হলো, হ্যাকার যদি salt সহ ডেটাবেজ চুরি করে ফেলে, তাহলেও সে pepper পাচ্ছে না। যার ফলে পাসওয়ার্ড ক্র্যাক করা আরো কঠিন হয়ে যাবে।
কয়েকটি জনপ্রিয় হ্যাশিং এলগোরিদম-
MD5SHA1SHA256MD5 এলগোরিদম এর ব্যাপারে
নতুন লার্নারদের বোঝার সুবিধার জন্য এখানে MD5 হ্যাশিং এলগোরিদম এর কথা উল্লেখ করেছি। প্র্যাকটিকালি MD5 দিয়ে কোন পাসওয়ার্ড বা সেনসেটিভ ডেটা সিকিউর করা আর রেকমেন্ডেড না কারণ ২০০০ সালের দিকেই এই এলগরিদমটি ক্র্যাক করে ফেলা হয়েছে।
পাসওয়ার্ড হ্যাশ করার জন্য বর্তমানে যেসব এলগোরিদম ইউজ হয় সেগুলো হলো-
bcryptscrypt