Digital Signature হল একটি ক্রিপ্টোগ্রাফিক প্রযুক্তি যা একটি বার্তার মৌলিকতা এবং অখণ্ডতা নিশ্চিত করতে ব্যবহৃত হয়। এটি ডিজিটাল ডেটার সাথে যুক্ত একটি সিগনেচার যা প্রমাণ করে যে ডেটাটি কোনও নির্দিষ্ট ব্যক্তির দ্বারা সৃষ্ট বা অনুমোদিত হয়েছে এবং যে কোনও পরিবর্তন বা হস্তক্ষেপ ঘটেনি।
Java Cryptography-তে Digital Signature তৈরি এবং যাচাই করার জন্য Java Cryptography Architecture (JCA) এবং Java Cryptography Extension (JCE) ব্যবহার করা হয়।
এখানে, আমরা দেখব কিভাবে Java ব্যবহার করে Digital Signature তৈরি করা এবং যাচাই করা যায়।
1. Digital Signature তৈরি করা
ডিজিটাল সিগনেচার তৈরি করার জন্য আমাদের Private Key ব্যবহার করতে হবে। এর মধ্যে SHA-256 (Secure Hash Algorithm) হ্যাশিং অ্যালগরিদম এবং RSA বা DSA (Digital Signature Algorithm) ব্যবহার করা হয়।
ধাপ ১: KeyPair (Public and Private Keys) তৈরি করা
প্রথমে একটি KeyPair (Public Key এবং Private Key) তৈরি করতে হবে। সাধারণত RSA বা DSA ব্যবহার করা হয়।
ধাপ ২: Message Digest তৈরি করা (Hashing)
ডিজিটাল সিগনেচার তৈরির জন্য প্রথমে মেসেজের একটি হ্যাশ (message digest) তৈরি করতে হবে। সাধারণত SHA-256 হ্যাশিং অ্যালগরিদম ব্যবহার করা হয়।
ধাপ ৩: Signature তৈরি করা
ডিজিটাল সিগনেচার তৈরি করতে, আমরা হ্যাশের উপর Private Key দিয়ে সাইন করি।
Example: Digital Signature তৈরি করা
import java.security.*;
import java.util.Base64;
public class DigitalSignatureExample {
public static void main(String[] args) {
try {
// KeyPairGenerator ব্যবহার করে Public/Private Key জেনারেট করা
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); // 2048-bit key size
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// Message Digest (SHA-256) তৈরি করা
String message = "This is a secret message.";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(message.getBytes());
// Signature object তৈরি করা
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(keyPair.getPrivate()); // Private key দিয়ে সাইনিং
signature.update(hash);
byte[] digitalSignature = signature.sign();
// Signature-টি Base64 এ কনভার্ট করা এবং প্রিন্ট করা
String encodedSignature = Base64.getEncoder().encodeToString(digitalSignature);
System.out.println("Generated Digital Signature: " + encodedSignature);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Explanation:
- KeyPairGenerator: এটি RSA কী-পেয়ার তৈরি করে, যেখানে একটি Public Key এবং একটি Private Key তৈরি হয়।
- MessageDigest: এটি SHA-256 হ্যাশিং অ্যালগরিদম ব্যবহার করে বার্তার হ্যাশ তৈরি করে।
- Signature: এই ক্লাসটি Private Key ব্যবহার করে হ্যাশের উপর সিগনেচার তৈরি করে।
- সিগনেচারটি Base64 ফরম্যাটে এনকোড করা হয়েছে যাতে এটি পাঠযোগ্য হয়।
Output:
Generated Digital Signature: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7V... (এটি একটি দীর্ঘ এনকোডেড সিগনেচার)
2. Digital Signature যাচাই করা
ডিজিটাল সিগনেচার যাচাই করতে, আমাদের Public Key এবং সিগনেচার ব্যবহার করতে হবে। যাচাই করার জন্য, মেসেজটি পুনরায় হ্যাশ করা হয় এবং সেই হ্যাশ এবং ডিজিটাল সিগনেচারের সাথে তুলনা করা হয়।
ধাপ ১: Public Key থেকে Signature যাচাই করা
সর্বশেষ, পাবলিক কী ব্যবহার করে সিগনেচার যাচাই করা হয়। যদি সিগনেচারটি বৈধ হয়, তাহলে এটি প্রমাণ করে যে মেসেজটি অপরিবর্তিত এবং নির্দিষ্ট ব্যক্তির দ্বারা সৃষ্ট।
Example: Digital Signature যাচাই করা
import java.security.*;
import java.util.Base64;
public class DigitalSignatureVerification {
public static void main(String[] args) {
try {
// Public Key এবং Private Key তৈরি করার জন্য সেই KeyPair ব্যবহার করা
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// Signature object তৈরি করা
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(keyPair.getPrivate());
String message = "This is a secret message.";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(message.getBytes());
signature.update(hash);
byte[] digitalSignature = signature.sign();
// Signature verification process
signature.initVerify(keyPair.getPublic()); // Public key দিয়ে সিগনেচার যাচাই
signature.update(hash);
boolean isVerified = signature.verify(digitalSignature); // Signature যাচাই
// সিগনেচার বৈধ কিনা যাচাই করা
if (isVerified) {
System.out.println("The digital signature is valid.");
} else {
System.out.println("The digital signature is invalid.");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Explanation:
- Signature.initVerify(): সিগনেচার যাচাই করতে পাবলিক কী ব্যবহার করা হয়।
- Signature.verify(): এটি সিগনেচার যাচাই করে এবং যদি সিগনেচারটি বৈধ হয়, তাহলে true রিটার্ন করবে, অন্যথায় false।
Output:
The digital signature is valid.
3. Best Practices for Digital Signatures
- Strong Key Pair: ডিজিটাল সিগনেচার তৈরি করার জন্য শক্তিশালী কী (যেমন, RSA-2048 বা RSA-4096) ব্যবহার করুন।
- Secure Key Storage: কী স্টোর করার সময় KeyStore ব্যবহার করুন এবং কী কখনও প্লেইন টেক্সটে সংরক্ষণ করবেন না।
- Use Hashing Algorithms: SHA-256 বা এর উপরের শক্তিশালী হ্যাশ অ্যালগরিদম ব্যবহার করুন, কারণ পুরানো অ্যালগরিদম (যেমন MD5, SHA-1) দুর্বল হয়ে গেছে।
- Timestamping: ডিজিটাল সিগনেচার আরও নিরাপদ করতে timestamping ব্যবহার করা যেতে পারে।
- Regular Key Rotation: নিয়মিত কী পরিবর্তন করুন এবং কী ফাঁস হওয়ার ঝুঁকি কমানোর জন্য কী রোটেশন পদ্ধতি অনুসরণ করুন।
ডিজিটাল সিগনেচার একটি অত্যন্ত গুরুত্বপূর্ণ ক্রিপ্টোগ্রাফিক ফিচার, যা ডেটার মৌলিকতা, অখণ্ডতা এবং উৎস যাচাই নিশ্চিত করে। Java Cryptography ব্যবহার করে আপনি সহজেই ডিজিটাল সিগনেচার তৈরি এবং যাচাই করতে পারেন।
- Digital Signature Creation: Private Key দিয়ে সিগনেচার তৈরি করা হয়।
- Signature Verification: Public Key ব্যবহার করে সিগনেচার যাচাই করা হয়।
এটি নিরাপত্তা নিশ্চিত করার একটি শক্তিশালী পদ্ধতি, বিশেষত ডিজিটাল ট্রানজেকশনের ক্ষেত্রে।
Read more