পাইথনে ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন ব্যবহার করে মেসেজ অথেনটিকেশন HMAC (Keyed-Hashing for Message Authentication) মেকানিজম দ্বারা অর্জন করা যায়। আমরা একাধিক ইটারেবল হ্যাশ ফাংশন যেমন MD5, SHA-1 কে একটি শেয়ার্ড সিক্রেট কী (shared secret key) এর সাথে কম্বাইন করে HMAC ব্যবহার করতে পারি।
মূল ধারণা হলো আমাদের ডেটা সিকিউর করা, আসল ডেটার সাথে একটি শেয়ার্ড সিক্রেট কী কম্বাইন করে একটি ক্রিপ্টোগ্রাফিক হ্যাশ জেনারেট করে। চূড়ান্ত ফলাফলটি সিক্রেট কী ছাড়াই পাঠানো হয় কিন্তু ফলাফল হ্যাশটি ট্রান্সমিটেড বা স্টোর করা মেসেজ যাচাই করতে ব্যবহার করা যায়।
সিনট্যাক্স
hmac.new(key, msg=None, digestmod=None)
একটি নতুন hmac অবজেক্ট জেনারেট করে রিটার্ন করে।
যেখানে -
Key – শেয়ার্ড সিক্রেট কী।
Msg – হ্যাশ করার মেসেজ।
Digestmod – HMAC অবজেক্ট যে ডাইজেস্ট নাম বা মডিউল ব্যবহার করবে।
HMAC মডিউলের মেথড ও অ্যাট্রিবিউট:
hmac.update(message)
দেওয়া মেসেজ ব্যবহার করে hmac অবজেক্ট আপডেট করতে ব্যবহৃত হয়। এই মেথড একাধিকবার কল করলে মেসেজগুলো অ্যাপেন্ড হবে।
hmac.digest()
update() মেথডে যেসব বাইটস পাস করা হয়েছে তার ডাইজেস্ট রিটার্ন করে।
hashlib.hexdigest()
digest() এর মতো, কিন্তু ডাইজেস্টটি একটি স্ট্রিং হিসেবে রিটার্ন করে যেটির দৈর্ঘ্য দ্বিগুণ এবং শুধু হেক্সাডেসিমাল ডিজিট ধারণ করে। এটি ইমেইল বা অন্যান্য নন-বাইনারি এনভায়রনমেন্টে ভ্যালু নিরাপদে এক্সচেঞ্জ করতে ব্যবহার করা যায়।
haslib.copy()
hmac অবজেক্টের একটি কপি ("clone") রিটার্ন করে।
উদাহরণ ১
ডিফল্ট MD5 হ্যাশ অ্যালগরিদম ব্যবহার করে একটি হ্যাশ তৈরি করা।
# লাইব্রেরি ইম্পোর্ট
import hashlib
import hmac
# ডেটা আপডেট
update_bytes = b'Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
Suspendisse tristique condimentum viverra. Nulla accumsan \
orci risus, non congue lacus feugiat id.'
# সিক্রেট কী
password = b'402xy5#'
# MD5 ব্যবহার করে ক্রিপ্টোগ্রাফিক হ্যাশ জেনারেট
my_hmac = hmac.new(update_bytes, password, hashlib.md5)
print("The first digest: " + str(my_hmac.digest()))
print("The Canonical Name: " + my_hmac.name)
print("Block size: " + str(my_hmac.block_size) + "bytes")
print("Digest size: " + str(my_hmac.digest_size) + "bytes")
# hmac অবজেক্টের একটি কপি তৈরি
my_hmac_cpy = my_hmac.copy()
print("The Copied digest: " + str(my_hmac_cpy.digest()))
আউটপুট
The first digest: b'H\xcc.nf\xdd\x8bC\x8di\x0cC\xb8\xe9l\xa8' The Canonical Name: hmac-md5 Block size: 64bytes Digest size: 16bytes The Copied digest: b'H\xcc.nf\xdd\x8bC\x8di\x0cC\xb8\xe9l\xa8'
SHA1, MD5 অ্যালগরিদম চেয়ে বেশি সিকিউর মনে হয়। যদি আপনি উপরের প্রোগ্রামটি SHA1 অ্যালগরিদম ব্যবহার করে চালাতে চান, তবে শুধু এই লাইনে অ্যালগরিদমের নাম পরিবর্তন করুন:
my_hmac = hmac.new(update_bytes, password, hashlib.sha1)
আমাদের ফলাফল কিছু এই রকম হবে:
The first digest: b'\xc3T\xe7[\xc8\xa3O/$\xbd`A\xad\x07d\xe8\xae\xa2!\xb4'
The Canonical Name: hmac-sha1 Block size: 64bytes Digest size: 20bytes The Copied digest: b'\xc3T\xe7[\xc8\xa3O/$\xbd`A\xad\x07d\xe8\xae\xa2!\xb4'
আপ্লিকেশন
HMAC অথেনটিকেশন মেকানিজমটি যেকোনো জায়গায় ব্যবহার করা যেতে পারে যেখানে সিকিউরিটি গুরুত্বপূর্ণ, যেমন পাবলিক নেটওয়ার্ক সার্ভিস। উদাহরণস্বরূপ, পাবলিক নেটওয়ার্কে আমরা একটি গুরুত্বপূর্ণ ফাইল/ডেটা পাইপ বা সকেট দিয়ে পাঠাচ্ছি, সেই ফাইল/ডেটা সাইন করা উচিত এবং ডেটা ব্যবহারের আগে সিগনেচারটি টেস্ট করা উচিত।