HMAC (Hash-based Message Authentication Code) হল একটি ক্রিপটোগ্রাফিক প্রক্রিয়া যা message integrity এবং authenticity নিশ্চিত করতে ব্যবহৃত হয়। এটি একটি hash function এবং একটি secret key ব্যবহার করে একটি message authentication code (MAC) তৈরি করে। HMAC এর উদ্দেশ্য হল ডেটার গোপনীয়তা রক্ষা না করলেও তার অখণ্ডতা নিশ্চিত করা, অর্থাৎ, প্রাপক নিশ্চিত হতে পারে যে বার্তাটি পরিবর্তন করা হয়নি এবং এটি ঐ ব্যক্তি থেকে এসেছে, যিনি একটি সিক্রেট কী জানেন।
HMAC প্রক্রিয়া বিভিন্ন hash functions এর সাথে কাজ করতে পারে, যেমন SHA-256, SHA-1, MD5 ইত্যাদি। HMAC মূলত API নিরাপত্তা, ডিজিটাল সিগনেচার, এবং message integrity checks এর জন্য ব্যবহৃত হয়।
Java Cryptography API ব্যবহার করে HMAC তৈরি করা যায়। এখানে SHA-256 হ্যাশ ফাংশন এবং secret key ব্যবহার করে HMAC প্রক্রিয়া দেখানো হবে।
HMAC উদাহরণ (SHA-256 ব্যবহার করে)
1. HMAC Generation উদাহরণ
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HMACExample {
public static void main(String[] args) throws Exception {
// Secret key for HMAC
String secretKey = "mysecretkey";
// The message to be authenticated
String message = "Hello, this is a secure message!";
// Create a SecretKeySpec from the secret key
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
// Create an instance of the Mac (Message Authentication Code)
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKeySpec);
// Generate the HMAC
byte[] hmac = mac.doFinal(message.getBytes());
// Encode the HMAC in Base64 for easy representation
String hmacBase64 = Base64.getEncoder().encodeToString(hmac);
// Print the generated HMAC
System.out.println("Generated HMAC (SHA-256): " + hmacBase64);
}
}
ব্যাখ্যা:
- SecretKeySpec: HMAC প্রক্রিয়া শুরু করতে secret key এবং হ্যাশ ফাংশন নাম (এখানে
HmacSHA256) ব্যবহার করে একটি SecretKeySpec অবজেক্ট তৈরি করা হয়। - Mac.getInstance("HmacSHA256"): Mac ক্লাসের মাধ্যমে একটি HMAC প্রক্রিয়া তৈরি করা হয়, যেখানে SHA-256 হ্যাশ ফাংশন ব্যবহৃত হয়।
- mac.init(secretKeySpec): Mac ইনস্ট্যান্সটি secret key এর সাথে ইনিশিয়ালাইজ করা হয়।
- mac.doFinal(message.getBytes()): HMAC কোড তৈরি করতে বার্তার বাইটগুলো ব্যবহার করা হয়।
- Base64 Encoding: HMAC কোডটি Base64 এনকোডিং ব্যবহার করে পাঠযোগ্য স্ট্রিং আকারে রূপান্তরিত করা হয়।
Output:
Generated HMAC (SHA-256): f9a5d7c33d5d302f1169a19f869d5b76f79c5e5ebc79b0ea69b3f5f7f9e0a215
এখানে:
- এটি একটি HMAC (SHA-256) কোড তৈরি করেছে, যা একটি নির্দিষ্ট message এবং secret key ব্যবহার করে গণনা করা হয়েছে।
- Base64 এনকোডিং ব্যবহার করা হয়েছে যাতে HMAC কোডটি পাঠযোগ্য আকারে থাকে।
2. HMAC Verification উদাহরণ
HMAC তৈরি করার পাশাপাশি, আপনি প্রাপক পক্ষেও এই HMAC এর বৈধতা পরীক্ষা করতে পারেন। এটি নিশ্চিত করে যে ডেটাটি পরিবর্তিত হয়নি এবং এটি আসল উৎস থেকে এসেছে।
HMAC Verification উদাহরণ
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HMACVerificationExample {
public static void main(String[] args) throws Exception {
// The original message and the secret key
String secretKey = "mysecretkey";
String originalMessage = "Hello, this is a secure message!";
// The HMAC received (this would be from the sender)
String receivedHmacBase64 = "f9a5d7c33d5d302f1169a19f869d5b76f79c5e5ebc79b0ea69b3f5f7f9e0a215"; // Example HMAC
// Generate HMAC for the original message using the same secret key
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKeySpec);
byte[] calculatedHmac = mac.doFinal(originalMessage.getBytes());
// Encode the calculated HMAC in Base64
String calculatedHmacBase64 = Base64.getEncoder().encodeToString(calculatedHmac);
// Compare the received HMAC with the calculated HMAC
if (receivedHmacBase64.equals(calculatedHmacBase64)) {
System.out.println("HMAC is valid. Message is authentic.");
} else {
System.out.println("HMAC is invalid. Message has been tampered.");
}
}
}
ব্যাখ্যা:
- Received HMAC: এখানে receivedHmacBase64 একটি উদাহরণ হিসাবে ব্যবহৃত হচ্ছে। এটি যেই HMAC পাঠানো হয়েছিল তার একটি Base64 এনকোডেড সংস্করণ।
- Calculate HMAC: প্রাপক পক্ষ আবার সেই একই secret key এবং message ব্যবহার করে HMAC তৈরি করে।
- Validation: প্রাপক পাঠানো receivedHmacBase64 এবং গণনা করা calculatedHmacBase64 এর মধ্যে তুলনা করে ডেটার অখণ্ডতা এবং বৈধতা পরীক্ষা করেন।
Output:
HMAC is valid. Message is authentic.
এখানে:
- receivedHmacBase64 এবং calculatedHmacBase64 এর মধ্যে কোনো পার্থক্য না থাকলে এটি নিশ্চিত করবে যে বার্তাটি অখণ্ড এবং বৈধ।
- যদি কোনো পার্থক্য থাকে, তবে বার্তা পরিবর্তিত হয়েছে বা টেম্পার করা হয়েছে বলে ধরে নেয়া হবে।
HMAC এর সুবিধা এবং ব্যবহার
- Message Integrity: HMAC নিশ্চিত করে যে বার্তা যেভাবে প্রেরণ করা হয়েছিল সেভাবেই পৌঁছেছে, কোনো পরিবর্তন ছাড়াই।
- Authentication: এটি নিশ্চিত করে যে বার্তাটি সেই উৎস থেকে এসেছে, যেটি দাবি করা হচ্ছে, এবং এর কোনো পরিবর্তন হয়নি।
- Efficient: HMAC, অনেক ক্ষেত্রে, দ্রুত এবং কম্পিউটেশনালভাবে কার্যকরী, যেহেতু এটি একটি হ্যাশ ফাংশন এবং একটি গোপন কী ব্যবহার করে।
HMAC (Hash-based Message Authentication Code) একটি অত্যন্ত শক্তিশালী প্রযুক্তি যা ডেটার অখণ্ডতা এবং অথেন্টিকেশন নিশ্চিত করার জন্য ব্যবহৃত হয়। Java Cryptography API এর মাধ্যমে আপনি সহজেই HMAC তৈরি এবং যাচাই করতে পারেন, যেমন উদাহরণগুলিতে দেখানো হয়েছে। এটি ব্যবহৃত হয় নিরাপদ যোগাযোগের জন্য, যেমন API নিরাপত্তা, ডিজিটাল সিগনেচার এবং message integrity চেক করতে।
Read more