সকল আইটি কোম্পানির প্রধান চিন্তা তাদের ডেটার সিকিউরিটি। ডেটা প্রোটেক্ট ও চেক করার জন্য একাধিক হ্যাশিং টেকনিক রয়েছে।
হ্যাশ (Hash) কী
হ্যাশ হলো একটি ফাংশন যা ভেরিয়েবল লেঞ্থের বাইট সিকোয়েন্স ইনপুট হিসেবে নেয় এবং তা একটি ফিক্সড লেঞ্থের সিকোয়েন্সে রূপান্তর করে। তবে, আপনার মূল ডেটা (ইনপুট বাইটস) ফিরে পাওয়া সহজ নয়। উদাহরণস্বরূপ, x হলো আপনার ইনপুট এবং f হলো হ্যাশিং ফাংশন, তবে f(x) ক্যালকুলেট করা দ্রুত এবং সহজ কিন্তু x আবার পাওয়া খুব সময়সাপেক্ষ কাজ।
হ্যাশ ফাংশন থেকে রিটার্ন করা ভ্যালুকে হ্যাশ, চেকসাম, হ্যাশ ভ্যালু বা মেসেজ ডাইজেস্ট বলা হয়।
উপরের কথাগুলো নিচে সারসংক্ষেপ করা হলো:

মান লেইয়া যাক, আপনি "Hello World" মেসেজটি MD5 হ্যাশ ফাংশনে কনভার্ট করতে চান তবে ফলাফল হবে একটি,

রিয়াল লাইফ সিনেরিওতে, হ্যাশ ফাংশনগুলো ক্রিপ্টোগ্রাফিক অ্যালগরিদম, ডিজিটাল সিগনেচার, ফিঙ্গারপ্রिंট, পাসওয়ার্ড স্টোরেজ এবং আরও অনেক জায়গায় ব্যাপকভাবে ব্যবহার হয়। একজন পাইথন প্রোগ্রামার হিসেবে, আমাদের হ্যাশ ফাংশন প্রয়োজন ডেটা বা ফাইলের ডুপ্লিকেসি চেক করতে, পাবলিক নেটওয়ার্কে ডেটা ট্রান্সমিট করার সময় ডেটা ইন্টিগ্রিটি চেক করতে, ডেটাবেসে পাসওয়ার্ড স্টোর করতে ইত্যাদি।
দুটি সবচেয়ে বেশি ব্যবহৃত হ্যাশ ফাংশন বা অ্যালগরিদম হলো:
MD5 - MD5 বা মেসেজ ডাইজেস্ট অ্যালগরিদম ১২৮-বিট হ্যাশ ভ্যালু তৈরি করে। MD5 অ্যালগরিদমের সাথে কিছু সিকিউরিটি ইস্যু রয়েছে তাই আমরা মূলত ডেটা ইন্টিগ্রিটি চেক করতে এটি ব্যবহার করি।
SHA - SHA গ্রুপের অধীনে একাধিক অ্যালগরিদম রয়েছে, যা ইউ.এস. ফেডারেল ইনফরমেশন প্রসেসিং স্ট্যান্ডার্ড দ্বারা ডেভেলপড। এই অ্যালগরিদমগুলো MD5 চেয়ে অনেক বেশি সিকিউর এবং তাই ক্রিপ্টোগ্রাফিক অ্যাপ্লিকেশন সহ বিভিন্ন জায়গায় ব্যাপকভাবে ব্যবহৃত হয়। এই অ্যালগরিদমগুলো দ্বারা জেনারেট করা মেসেজ ১৬০ বিট থেকে ৫১২ বিট পর্যন্ত হয়।
MD5
পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে hashlib নামক একটি মডিউল রয়েছে যেটে অধিকাংশ জনপ্রিয় হ্যাশিং অ্যালগরিদম থাকে। অধিকাংশ অ্যালগরিদম hashlib মডিউলের ভেতরে বাস্তবায়িত, তবে যদি আপনার সিস্টেমে OpenSSL ইনস্টল থাকে, তবে hashlib সেগুলোও ব্যবহার করতে পারে।
প্রথমে, আপনি যদি যেকোনো হ্যাশিং অ্যালগরিদম ব্যবহার করতে চান, তবে hashlib মডিউল ইম্পোর্ট করুন:
import hashlib
এখন চেক করুন যে প্রয়োজনীয় অ্যালগরিদম বা hashlib মডিউলে কী কী অ্যালগরিদম বর্তমানে উপলব্ধ:
>>> print(hashlib.algorithms_available)
{'sha3_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'dsaEncryption', 'dsaWithSHA', 'DSA', 'md5', 'sha384', 'sha224', 'sha3_384', 'ecdsa-with-SHA1', 'DSA-SHA', 'SHA1', 'md4', 'SHA256', 'MD4', 'sha3_512', 'whirlpool', 'sha256', 'shake_256', 'SHA', 'RIPEMD160', 'shake_128', 'SHA512', 'ripemd160', 'SHA224', 'sha', 'blake2s', 'SHA384', 'MD5'}
উপরের লিস্টে hashlib মডিউলের মাধ্যমে উপলব্ধ অ্যালগরিদমগুলোর মধ্যে OpenSSL-এর মাধ্যমে থাকা অ্যালগরিদমগুলও অন্তর্ভুক্ত।
তবে, সবসময় উপলব্ধ অ্যালগরিদমের লিস্ট চেক করতে চাইলে algorithms_guaranteed দিয়ে চেক করতে পারেন।
>>> print(hashlib.algorithms_guaranteed)
{'sha3_512', 'sha256', 'sha3_256', 'shake_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'md5', 'shake_128', 'sha384', 'sha224', 'sha3_384', 'blake2s'}
চলুন MD5 অ্যালগরিদম দিয়ে একটি সিম্পল প্রোগ্রাম বানাই:
কোড
import hashlib hash_obj = hashlib.md5(b'Hello, Python!') print(hash_obj.hexdigest())
আউটপুট
a0af7810eb5fcb84c730f851361de06a
উপরের কোডটি "Hello, Python!" স্ট্রিং ইনপুট হিসেবে নেয় এবং সেটির HEX ডাইজেস্ট প্রিন্ট করে। Hexdigest হ্যাশকে রিপ্রেজেন্ট করার একটি HEX স্ট্রিং রিটার্ন করে।
তবে, আপনি যদি বাইটস সিকোয়েন্স রিটার্ন চান, তবে hash_obj.digest() ব্যবহার করুন, যেন:
import hashlib hash_obj = hashlib.md5(b'Hello, Python!') # বাইটস সিকোয়েন্স জেনারেট করতে print(hash_obj.digest())
আউটপুট
b'\xa0\xafx\x10\xeb_\xcb\x84\xc70\xf8Q6\x1d\xe0j'
আপনি লক্ষ্য করেছেন, আমরা স্ট্রিং লিটারেলের আগে 'b' ব্যবহার করেছি, এটি স্ট্রিং থেকে বাইটস জেনারেট করার জন্য কারণ হ্যাশিং ফাংশন শুধু বাইটস সিকোয়েন্স প্যারামিটার হিসেবে গ্রহণ করে।
যদি আপনি কনসোল থেকে স্ট্রিং পাস করতে চান, তবে স্ট্রিংটি বাইটস সিকোয়েন্সে এনকোড করা ভুলবেন না:
import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.md5(mystring.encode())
print(hash_obj.hexdigest())
আউটপুট
Enter string to hash: Hello, TutorialsPoint 9a5d3fad65690dcf44adaec67226abe7