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

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

রিয়াল লাইফ সিনেরিওতে, হ্যাশ ফাংশনগুলো ক্রিপ্টোগ্রাফিক অ্যালগরিদম, ডিজিটাল সিগনেচার, ফিঙ্গারপ্রिंট, পাসওয়ার্ড স্টোরেজ এবং আরও অনেক জায়গায় ব্যাপকভাবে ব্যবহার হয়। একজন পাইথন প্রোগ্রামার হিসেবে, আমাদের হ্যাশ ফাংশন প্রয়োজন ডেটা বা ফাইলের ডুপ্লিকেসি চেক করতে, পাবলিক নেটওয়ার্কে ডেটা ট্রান্সমিট করার সময় ডেটা ইন্টিগ্রিটি চেক করতে, ডেটাবেসে পাসওয়ার্ড স্টোর করতে ইত্যাদি।
দুটি সবচেয়ে বেশি ব্যবহৃত হ্যাশ ফাংশন বা অ্যালগরিদম হলো:
MD5 - MD5 বা মেসেজ ডাইজেস্ট অ্যালগরিদম ১২৮-বিট হ্যাশ ভ্যালু তৈরি করে। MD5 অ্যালগরিদমের সাথে কিছু সিকিউরিটি ইস্যু রয়েছে তাই আমরা মূলত ডেটা ইন্টিগ্রিটি চেক করতে এটি ব্যবহার করি।
SHA - SHA গ্রুপের অধীনে একাধিক অ্যালগরিদম রয়েছে, যা ইউ.এস. ফেডারেল ইনফরমেশন প্রসেসিং স্ট্যান্ডার্ড দ্বারা ডেভেলপড। এই অ্যালগরিদমগুলো MD5 চেয়ে অনেক বেশি সিকিউর এবং তাই ক্রিপ্টোগ্রাফিক অ্যাপ্লিকেশন সহ বিভিন্ন জায়গায় ব্যাপকভাবে ব্যবহৃত হয়। এই অ্যালগরিদমগুলো দ্বারা জেনারেট করা মেসেজ ১৬০ বিট থেকে ৫১২ বিট পর্যন্ত হয়।
SHA1
SHA হলো অ্যালগরিদমের একটি গ্রুপ যেন: SHA1, SHA224, SHA256, SHA384, SHA512। SHA1 অ্যালগরিদম, MD5 চেয়ে বেশি সিকিউর বলে মনে হয় এবং তাই অনেক জায়গায় ব্যাপকভাবে ব্যবহৃত হয়।
প্রথমে, আপনি যদি যেকোনো হ্যাশিং অ্যালগরিদম ব্যবহার করতে চান, তবে 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'}
চলুন SHA1 অ্যালগরिदম বুঝতে একটি সিম্পল প্রোগ্রাম বানাই:
import hashlib hash_obj = hashlib.sha1(b'Hello, Python!') print(hash_obj.hexdigest())
আউটপুট
00d375a3693fde63e9540b91656c6ac5b5341f7c
তবে, আপনি যদি বাইটস সিকোয়েন্স রিটার্ন চান, তবে hash_obj.digest() ব্যবহার করুন, যেন:
import hashlib hash_obj = hashlib.sha1(b'Hello, Python!') # বাইটস সিকোয়েন্স জেনারেট করতে print(hash_obj.digest())
আউটপুট
b'\x00\xd3u\xa3i?\xdec\xe9T\x0b\x91elj\xc5\xb54\x1f|'
আপনি লক্ষ্য করেছেন, আমরা স্ট্রিং লিটারেলের আগে 'b' ব্যবহার করেছি, এটি স্ট্রিং থেকে বাইটস জেনারেট করার জন্য কারণ হ্যাশিং ফাংশন শুধু বাইটস সিকোয়েন্স প্যারামিটার হিসেবে গ্রহণ করে।
যদি আপনি কনসোল থেকে স্ট্রিং পাস করতে চান, তবে স্ট্রিংটি বাইটস সিকোয়েন্সে এনকোড করা ভুলবেন না:
import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.sha1(mystring.encode())
print(hash_obj.hexdigest())
আউটপুট
Enter string to hash: Hello, TutorialsPoint b20d14ead3e50552fc1f1cd96696b111a163dffa