Java Security Examples

Java Technologies - জাভা উদাহরন (Java  Examples)
140
140

Java বিভিন্ন লাইব্রেরি এবং এপিআই প্রদান করে যা অ্যাপ্লিকেশনে নিরাপত্তা ফিচারগুলি প্রয়োগ করতে সাহায্য করে। এখানে কিছু সাধারণ Java সিকিউরিটি উদাহরণ দেওয়া হল, যা এনক্রিপশন, ডিক্রিপশন, হ্যাশিং এবং কী ম্যানেজমেন্ট সম্পর্কিত।

১. হ্যাশিং উদাহরণ: SHA-256

এই উদাহরণে, আমরা SHA-256 হ্যাশিং অ্যালগরিদম ব্যবহার করে একটি পাসওয়ার্ড হ্যাশ করব।

উদাহরণ: SHA-256 দিয়ে পাসওয়ার্ড হ্যাশ করা

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashingExample {
    public static void main(String[] args) {
        try {
            // হ্যাশ করার জন্য ইনপুট স্ট্রিং
            String password = "mySecretPassword";

            // SHA-256 এর জন্য MessageDigest ইনস্ট্যান্স তৈরি করা
            MessageDigest digest = MessageDigest.getInstance("SHA-256");

            // পাসওয়ার্ডে হ্যাশ ফাংশন প্রয়োগ করা
            byte[] hash = digest.digest(password.getBytes());

            // বাইট অ্যারে থেকে হেক্সাডেসিমাল স্ট্রিং এ রূপান্তর করা
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                hexString.append(String.format("%02x", b));
            }

            // হ্যাশ করা পাসওয়ার্ড আউটপুট করা
            System.out.println("Hashed Password (SHA-256): " + hexString.toString());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • SHA-256 একটি ওয়ান-ওয়ে হ্যাশিং অ্যালগরিদম, যা ইনপুট (এখানে পাসওয়ার্ড) থেকে একটি নির্দিষ্ট আকারের হ্যাশ তৈরি করে।
  • MessageDigest.getInstance("SHA-256") SHA-256 ডাইজেস্ট ইনস্ট্যান্স তৈরি করে।
  • digest.digest() আসল হ্যাশিং কার্যক্রমটি সম্পন্ন করে।
  • এরপর, ফলস্বরূপ হ্যাশটি হেক্সাডেসিমাল স্ট্রিংয়ে রূপান্তর করা হয়।

আউটপুট:

Hashed Password (SHA-256): f9f4b45efed1e2f2c8e12ff503a0dcb40f5bdbf5eeb3d61d2702c481417f7ac7

২. সিমেট্রিক এনক্রিপশন উদাহরণ: AES এনক্রিপশন/ডিক্রিপশন

এই উদাহরণে, আমরা AES এনক্রিপশন এবং ডিক্রিপশন একটি সিক্রেট কী ব্যবহার করে প্রদর্শন করব।

উদাহরণ: AES এনক্রিপশন এবং ডিক্রিপশন

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESExample {
    public static void main(String[] args) throws Exception {
        // একটি র্যান্ডম AES কী জেনারেট করা
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);  // AES-128
        SecretKey secretKey = keyGenerator.generateKey();

        // এনক্রিপ্ট করার জন্য প্লেইনটেক্সট
        String plaintext = "This is a secret message";

        // সাইফার তৈরি করা
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Encrypted Text: " + encryptedText);

        // ডিক্রিপ্ট করার জন্য সাইফারটি আবার ইনিশিয়ালাইজ করা
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        String decryptedText = new String(decryptedBytes);
        System.out.println("Decrypted Text: " + decryptedText);
    }
}

ব্যাখ্যা:

  • AES (Advanced Encryption Standard) একটি সিমেট্রিক এনক্রিপশন অ্যালগরিদম, যার মানে হল যে এনক্রিপশন এবং ডিক্রিপশন উভয়ই একই কী দিয়ে করা হয়।
  • Cipher.getInstance("AES") AES এনক্রিপশন/ডিক্রিপশন ফাংশনালিটি প্রদান করে।
  • একটি SecretKey ব্যবহার করে এনক্রিপশন এবং ডিক্রিপশন করা হয়।
  • এনক্রিপ্টেড টেক্সট Base64 দিয়ে এনকোড করা হয় যাতে এটি পড়তে সহজ হয়।

আউটপুট:

Encrypted Text: XHOMz5h7erjj63c5uDEz8Q==
Decrypted Text: This is a secret message

৩. অ্যাসিমেট্রিক এনক্রিপশন উদাহরণ: RSA এনক্রিপশন/ডিক্রিপশন

এই উদাহরণে, আমরা RSA এনক্রিপশন এবং ডিক্রিপশন পাবলিক এবং প্রাইভেট কী ব্যবহার করে প্রদর্শন করব।

উদাহরণ: RSA এনক্রিপশন এবং ডিক্রিপশন

import java.security.*;
import javax.crypto.Cipher;
import java.util.Base64;

public class RSAExample {
    public static void main(String[] args) throws Exception {
        // RSA কীপেয়ার (পাবলিক এবং প্রাইভেট কী) তৈরি করা
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // এনক্রিপ্ট করার জন্য মেসেজ
        String message = "This is a confidential message";

        // পাবলিক কী ব্যবহার করে মেসেজ এনক্রিপ্ট করা
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedMessage = cipher.doFinal(message.getBytes());
        String encryptedText = Base64.getEncoder().encodeToString(encryptedMessage);
        System.out.println("Encrypted Text: " + encryptedText);

        // প্রাইভেট কী ব্যবহার করে মেসেজ ডিক্রিপ্ট করা
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedMessage = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        String decryptedText = new String(decryptedMessage);
        System.out.println("Decrypted Text: " + decryptedText);
    }
}

ব্যাখ্যা:

  • RSA একটি অ্যাসিমেট্রিক এনক্রিপশন অ্যালগরিদম, যার মানে হল যে এনক্রিপশন পাবলিক কী দিয়ে এবং ডিক্রিপশন প্রাইভেট কী দিয়ে করা হয়।
  • আমরা KeyPair জেনারেট করে পাবলিক এবং প্রাইভেট কী তৈরি করি।
  • মেসেজটি পাবলিক কী দিয়ে এনক্রিপ্ট করা হয় এবং প্রাইভেট কী দিয়ে ডিক্রিপ্ট করা হয়।
  • এনক্রিপ্ট করা মেসেজটি Base64 এনকোড করা হয় যাতে তা পাঠযোগ্য হয় এবং পরে ডিক্রিপ্ট করা হয়।

আউটপুট:

Encrypted Text: ztT3A4jQmK0hOk8mr9I1f3EklrGhzttEOBt4Jrgw6vkt8pt5Skrh/2p8kJSCKptgqMjfZLz7GF1Fw/xETK6Kh7usF0vh4lzFddYQFV2hnBcPsbZcDfjk8G5PBtPO9s74jV5WsRKK3RBGV9b8zQUk9w==
Decrypted Text: This is a confidential message

৪. ডিজিটাল সিগনেচার উদাহরণ

এই উদাহরণে, আমরা একটি ডিজিটাল সিগনেচার তৈরি এবং যাচাই করব RSA ব্যবহার করে।

উদাহরণ: ডিজিটাল সিগনেচার

import java.security.*;
import java.util.Base64;

public class DigitalSignatureExample {
    public static void main(String[] args) throws Exception {
        // RSA কীপেয়ার (প্রাইভেট এবং পাবলিক কী) তৈরি করা
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();

        // সাইন করার জন্য মেসেজ
        String message = "This message needs to be signed.";

        // প্রাইভেট কী ব্যবহার করে ডিজিটাল সিগনেচার তৈরি করা
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(message.getBytes());
        byte[] digitalSignature = signature.sign();
        String signatureStr = Base64.getEncoder().encodeToString(digitalSignature);
        System.out.println("Digital Signature: " + signatureStr);

        // পাবলিক কী ব্যবহার করে সিগনেচার যাচাই করা
        signature.initVerify(publicKey);
        signature.update(message.getBytes());
        boolean isValid = signature.verify(Base64.getDecoder().decode(signatureStr));
        System.out.println("Is the signature valid? " + isValid);
    }
}

ব্যাখ্যা:

  • ডিজিটাল সিগনেচার মেসেজের আসলত্ব এবং একীকারিতা নিশ্চিত করে।
  • Signature ব্যবহার করে সিগনেচার তৈরি এবং যাচাই করা হয়।
  • মেসেজটি প্রাইভেট কী দিয়ে সাইন করা হয় এবং পাবলিক কী দিয়ে যাচাই করা হয়।
  • সিগনেচারটি Base64 এনকোড করা হয় যাতে তা পাঠযোগ্য হয়।

আউটপুট:

Digital Signature: cTtP9abYqX2erLbSFFGxy9g+Q3WgX7KmvwW6uw63H2/06k5f/F0Znkn40ghw/jJMjBrs1r13m4ZxXGxOX9NSFg==
Is the signature valid? true

৫. KeyStore উদাহরণ

KeyStore ব্যবহার করে ক্রিপ্টো গ্রাফিক কী, সার্টিফিকেট এবং সিক্রেট কী সংরক্ষণ করা হয়।

উদাহরণ: KeyStore এ কী সংরক্ষণ এবং উদ্ধার

import java.io.*;
import java.security.*;
import java.security.cert.CertificateException;

public class KeyStoreExample {
    public static void main(String[] args) throws Exception {
        // KeyStore ইনস্ট্যান্স তৈরি
        KeyStore keyStore = KeyStore.getInstance("JKS");

        // KeyStore লোড বা তৈরি করা
        FileInputStream keyStoreFile = new FileInputStream("keystore.jks");
        keyStore.load(keyStoreFile, "keystorePassword".toCharArray());

        // KeyStore থেকে প্রাইভেট কী উদ্ধার
        PrivateKey privateKey = (PrivateKey) keyStore.getKey("myKey", "keyPassword".toCharArray());
        System.out.println("Private Key Retrieved: " + privateKey);
    }
}

ব্যাখ্যা:

  • KeyStore ক্রিপ্টো গ্রাফিক কী এবং সার্টিফিকেট ম্যানেজ করতে ব্যবহৃত হয়।
  • আপনি কী সংরক্ষণ, উদ্ধার বা লোড করতে পারেন KeyStore ব্যবহার করে একটি পাসওয়ার্ড দিয়ে।
  • কী উদ্ধার করার জন্য কী অ্যালিয়াস এবং পাসওয়ার্ড ব্যবহার করা হয়।

এই উদাহরণগুলো Java-তে বিভিন্ন সিকিউরিটি কার্যক্রম যেমন হ্যাশিং, এনক্রিপশন, ডিজিটাল সিগনেচার, এবং কী ম্যানেজমেন্ট নিয়ে কাজ করার জন্য ব্যবহার করা যেতে পারে। Java এর Security API শক্তিশালী এবং নমনীয় সিকিউরিটি ফিচার প্রদান করে যা সিমেট্রিক এবং অ্যাসিমেট্রিক এনক্রিপশন উভয় ধরনের কাজ করতে সহায়তা করে।

Content added By

Encryption এবং Decryption Example: Symmetric এবং Asymmetric Key ব্যবহার করে ডেটা এনক্রিপশন

113
113

Java-তে Encryption এবং Decryption বিভিন্ন পদ্ধতি ব্যবহার করে করা যেতে পারে। দুটি প্রধান পদ্ধতি হলো:

  1. Symmetric Key Encryption: যেখানে একই কিপর্যন্ত এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য একটি সাধারণ কী ব্যবহার করা হয়।
  2. Asymmetric Key Encryption: যেখানে দুটি কী ব্যবহৃত হয়, একটি পাবলিক কী (Encryption এর জন্য) এবং একটি প্রাইভেট কী (Decryption এর জন্য)।

এখানে আমি দুটি উদাহরণ দেখাবো—একটি Symmetric Key Encryption এবং একটি Asymmetric Key Encryption

1. Symmetric Key Encryption (AES)

এখানে AES (Advanced Encryption Standard) ব্যবহার করা হয়েছে, যা একটি জনপ্রিয় symmetric encryption অ্যালগরিদম। এখানে একই কী ব্যবহার করে ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করা হয়।

Symmetric Encryption Example (AES)

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class SymmetricEncryptionExample {

    public static void main(String[] args) throws Exception {
        // এনক্রিপশনের জন্য SecretKey তৈরি
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // 128-bit AES key
        SecretKey secretKey = keyGenerator.generateKey();
        
        // ডেটা এনক্রিপশন
        String data = "This is a secret message.";
        String encryptedData = encrypt(data, secretKey);
        System.out.println("Encrypted Data: " + encryptedData);

        // ডেটা ডিক্রিপশন
        String decryptedData = decrypt(encryptedData, secretKey);
        System.out.println("Decrypted Data: " + decryptedData);
    }

    // এনক্রিপ্ট করার মেথড
    public static String encrypt(String data, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    // ডিক্রিপ্ট করার মেথড
    public static String decrypt(String encryptedData, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedData = cipher.doFinal(decodedBytes);
        return new String(decryptedData);
    }
}

ব্যাখ্যা:

  • SecretKey: এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য একটি সাধারণ সিক্রেট কী ব্যবহৃত হয়।
  • Cipher.getInstance("AES"): AES অ্যালগরিদমের মাধ্যমে এনক্রিপশন/ডিক্রিপশন অপারেশনটি করা হয়।
  • Base64: এনক্রিপ্টেড ডেটাকে স্ট্রিং ফরম্যাটে রূপান্তর করার জন্য Base64 ব্যবহার করা হয়।

2. Asymmetric Key Encryption (RSA)

এখানে RSA অ্যালগরিদম ব্যবহার করা হয়েছে, যা একটি asymmetric encryption পদ্ধতি, যেখানে দুটি কী ব্যবহৃত হয়—একটি পাবলিক কী (এনক্রিপ্ট করার জন্য) এবং একটি প্রাইভেট কী (ডিক্রিপ্ট করার জন্য)।

Asymmetric Encryption Example (RSA)

import java.security.*;
import javax.crypto.Cipher;
import java.util.Base64;

public class AsymmetricEncryptionExample {

    public static void main(String[] args) throws Exception {
        // RSA কী পেয়ার তৈরি করা
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 2048-bit RSA key pair
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // ডেটা এনক্রিপশন
        String data = "This is a secret message with RSA!";
        String encryptedData = encrypt(data, publicKey);
        System.out.println("Encrypted Data: " + encryptedData);

        // ডেটা ডিক্রিপশন
        String decryptedData = decrypt(encryptedData, privateKey);
        System.out.println("Decrypted Data: " + decryptedData);
    }

    // পাবলিক কী দিয়ে এনক্রিপ্ট করার মেথড
    public static String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    // প্রাইভেট কী দিয়ে ডিক্রিপ্ট করার মেথড
    public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedData = cipher.doFinal(decodedBytes);
        return new String(decryptedData);
    }
}

ব্যাখ্যা:

  • KeyPairGenerator: RSA কী পেয়ার তৈরি করার জন্য ব্যবহৃত হয়। একটি পাবলিক কী এবং একটি প্রাইভেট কী তৈরি করা হয়।
  • Cipher.getInstance("RSA"): RSA অ্যালগরিদম ব্যবহার করে এনক্রিপশন এবং ডিক্রিপশন করা হয়।
  • PublicKey এবং PrivateKey: পাবলিক কী দিয়ে ডেটা এনক্রিপ্ট করা হয় এবং প্রাইভেট কী দিয়ে ডেটা ডিক্রিপ্ট করা হয়।

প্রধান পার্থক্য:

  • Symmetric Key Encryption (AES):
    • একটি একক কী ব্যবহার করা হয়।
    • দ্রুত এবং কার্যকর, তবে কী শেয়ারিং সমস্যা থাকতে পারে।
  • Asymmetric Key Encryption (RSA):
    • দুটি কী ব্যবহার করা হয়: একটি পাবলিক কী (এনক্রিপ্ট করার জন্য) এবং একটি প্রাইভেট কী (ডিক্রিপ্ট করার জন্য)।
    • নিরাপদ, তবে এটি স্লো এবং বড় ডেটা এনক্রিপশন ও ডিক্রিপশনের জন্য উপযুক্ত নয়। সাধারণত এটি ডিজিটাল সিগনেচার বা ছোট ডেটার জন্য ব্যবহৃত হয়।

এই উদাহরণগুলি AES এবং RSA অ্যালগরিদম ব্যবহার করে এনক্রিপশন এবং ডিক্রিপশন প্রক্রিয়া প্রদর্শন করে। Symmetric এবং Asymmetric Encryption উভয় পদ্ধতিই নিরাপদ ডেটা ট্রান্সমিশন নিশ্চিত করতে ব্যবহৃত হয়।

Content added By

Digital Signature Example: Digital Signature তৈরি এবং Verify করা

146
146

A digital signature is a cryptographic mechanism used to verify the authenticity and integrity of a message or document. It provides a way to ensure that a message has not been altered and that it comes from the expected sender.

Java provides the Java Cryptography Architecture (JCA) to create digital signatures using algorithms such as RSA, DSA, and ECDSA.

Below is an example of how to create and verify a digital signature using the RSA algorithm in Java.

Steps Involved:

  1. Generate a key pair (public and private keys).
  2. Create a digital signature using the private key.
  3. Verify the digital signature using the public key.

১. Digital Signature Creation (Signing a Message)

This code demonstrates how to create a digital signature using the private key.

import java.security.*;
import java.util.Base64;

public class DigitalSignatureExample {
    public static void main(String[] args) {
        try {
            // Generate RSA Key Pair (Private and Public Keys)
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(2048);  // 2048-bit key size
            KeyPair keyPair = keyPairGenerator.generateKeyPair();

            PrivateKey privateKey = keyPair.getPrivate();
            PublicKey publicKey = keyPair.getPublic();

            // Message to be signed
            String message = "This is a confidential message";

            // Create a Signature object
            Signature signature = Signature.getInstance("SHA256withRSA");

            // Initialize the Signature object with the private key
            signature.initSign(privateKey);

            // Update the Signature object with the message data
            signature.update(message.getBytes());

            // Generate the digital signature
            byte[] digitalSignature = signature.sign();

            // Print the digital signature (Base64 encoded for readability)
            String encodedSignature = Base64.getEncoder().encodeToString(digitalSignature);
            System.out.println("Digital Signature (Base64 encoded): " + encodedSignature);

            // Now verify the signature using the public key
            boolean isVerified = verifySignature(message, encodedSignature, publicKey);
            System.out.println("Signature Verified: " + isVerified);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Method to verify the digital signature using the public key
    public static boolean verifySignature(String message, String encodedSignature, PublicKey publicKey) {
        try {
            // Decode the Base64 encoded signature
            byte[] signatureBytes = Base64.getDecoder().decode(encodedSignature);

            // Create a Signature object for verification
            Signature signature = Signature.getInstance("SHA256withRSA");

            // Initialize the Signature object with the public key
            signature.initVerify(publicKey);

            // Update the Signature object with the message data
            signature.update(message.getBytes());

            // Verify the signature
            return signature.verify(signatureBytes);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

ব্যাখ্যা:

  1. Key Pair Generation:
    • KeyPairGenerator ক্লাস ব্যবহার করে RSA কীগুলি তৈরি করা হয় (2048-বিট)। এটি একটি PrivateKey এবং একটি PublicKey তৈরি করে।
  2. Digital Signature Creation:
    • Signature.getInstance("SHA256withRSA") ব্যবহার করে আমরা SHA-256 হ্যাশিং এলগরিদমের মাধ্যমে RSA ডিজিটাল সিগনেচার তৈরি করি।
    • প্রথমে private key দিয়ে সিগনেচার সাইন করা হয়।
    • এরপর সিগনেচার তৈরি করার জন্য signature.sign() পদ্ধতি ব্যবহার করা হয়।
  3. Digital Signature Verification:
    • সিগনেচার যাচাই করতে public key ব্যবহার করা হয়।
    • signature.verify(signatureBytes) পদ্ধতি দিয়ে যাচাই করা হয় যে, সিগনেচার সঠিক এবং মূল বার্তা (message) সঙ্গে সঙ্গতিপূর্ণ।
  4. Base64 Encoding:
    • ডিজিটাল সিগনেচারটি বাইনারি ফর্মে থাকে, তাই এটি মানবপঠনযোগ্য করার জন্য Base64 encoding করা হয়।

আউটপুট:

Digital Signature (Base64 encoded): <Base64_Encoded_Signature>
Signature Verified: true

২. KeyPair Generation (KeyPair)

  • Private Key: এটি সিগনেচার সাইন করার জন্য ব্যবহৃত হয়। এটি গোপন রাখা উচিত।
  • Public Key: এটি সিগনেচার যাচাই করার জন্য ব্যবহৃত হয় এবং এটি অন্যদের সাথে শেয়ার করা যায়।

৩. Digital Signature Verification

  • ডিজিটাল সিগনেচার যাচাই করার জন্য public key ব্যবহার করা হয়। যদি সিগনেচার সঠিক হয় এবং বার্তা পরিবর্তন না হয়ে থাকে, তবে এটি true ফেরত দেয়।

এই উদাহরণটি দেখিয়েছে কিভাবে আপনি জাভাতে ডিজিটাল সিগনেচার তৈরি এবং যাচাই করতে পারেন। এটি একটি নিরাপদ পদ্ধতি যা বার্তার অখণ্ডতা এবং প্রমাণীকরণের জন্য ব্যবহৃত হয়।

Content added By

Secure Socket Layer (SSL) Example: SSL ব্যবহারে Secure Communication

106
106

Java Secure Socket Layer (SSL) ব্যবহারের মাধ্যমে নিরাপদ যোগাযোগ প্রতিষ্ঠা করার জন্য SSL প্রোটোকল ব্যবহার করা হয়। Java-তে SSL বা TLS (Transport Layer Security) ব্যবহার করা অনেক সাধারণ কাজের মধ্যে একটি, যেমন নিরাপদ HTTP (HTTPS) সংযোগ বা অন্যান্য নিরাপদ সঞ্চালন ব্যবস্থার জন্য।

Java-তে SSL প্রোটোকল ব্যবহারের জন্য, আপনি সাধারণত SSLSocket বা SSLServerSocket ব্যবহার করতে পারেন, যা javax.net.ssl প্যাকেজে উপলব্ধ।

নিচে একটি উদাহরণ দেওয়া হলো যেখানে একটি SSL Client এবং SSL Server তৈরি করা হবে:

১. SSL Server Example (Java)

এই উদাহরণে, আমরা একটি SSL Server তৈরি করব, যা ক্লায়েন্ট থেকে সংযোগ গ্রহণ করবে এবং নিরাপদভাবে ডেটা প্রেরণ করবে।

SSL Server (Server.java)

import javax.net.ServerSocketFactory;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import java.io.*;
import java.security.KeyStore;

public class SSLServer {
    public static void main(String[] args) {
        try {
            // KeyStore পাসওয়ার্ড এবং ফাইল পাথ সেট করা
            char[] password = "password".toCharArray();
            KeyStore keyStore = KeyStore.getInstance("JKS");
            FileInputStream keyStoreFile = new FileInputStream("server.jks");  // Server KeyStore ফাইল
            keyStore.load(keyStoreFile, password);

            // KeyManagerFactory তৈরি করা এবং KeyStore সেট করা
            javax.net.ssl.KeyManagerFactory keyManagerFactory = javax.net.ssl.KeyManagerFactory.getInstance("SunX509");
            keyManagerFactory.init(keyStore, password);

            // SSLServerSocketFactory তৈরি করা
            SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

            // SSLServerSocket তৈরি করা
            SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(9999);
            System.out.println("SSL Server started and waiting for client connection...");

            while (true) {
                // ক্লায়েন্ট সংযোগ গ্রহণ করা
                javax.net.ssl.SSLSocket sslSocket = (javax.net.ssl.SSLSocket) sslServerSocket.accept();
                System.out.println("Client connected: " + sslSocket.getInetAddress());

                // ক্লায়েন্টের সাথে ইন্টারঅ্যাক্ট করা
                BufferedReader reader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
                PrintWriter writer = new PrintWriter(sslSocket.getOutputStream(), true);

                String clientMessage;
                while ((clientMessage = reader.readLine()) != null) {
                    System.out.println("Received from client: " + clientMessage);
                    writer.println("Server response: " + clientMessage.toUpperCase());
                }

                sslSocket.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • KeyStore: SSL সিকিউরিটির জন্য সার্ভারের সার্টিফিকেট সংরক্ষণ করা হয়।
  • SSLServerSocket: এটি SSL কানেকশন তৈরি করার জন্য ব্যবহৃত হয়।
  • সার্ভার ক্লায়েন্টের কাছে একটি নিরাপদ সংযোগ গ্রহণ করে এবং তা সুরক্ষিতভাবে যোগাযোগ করে।

২. SSL Client Example (Java)

এখন আমরা একটি SSL Client তৈরি করব, যা সার্ভারের সাথে নিরাপদভাবে সংযোগ করবে এবং ডেটা পাঠাবে।

SSL Client (Client.java)

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
import java.security.KeyStore;

public class SSLClient {
    public static void main(String[] args) {
        try {
            // KeyStore পাসওয়ার্ড এবং ফাইল পাথ সেট করা
            char[] password = "password".toCharArray();
            KeyStore keyStore = KeyStore.getInstance("JKS");
            FileInputStream keyStoreFile = new FileInputStream("client.jks");  // Client KeyStore ফাইল
            keyStore.load(keyStoreFile, password);

            // TrustManagerFactory তৈরি করা এবং KeyStore সেট করা
            javax.net.ssl.TrustManagerFactory trustManagerFactory = javax.net.ssl.TrustManagerFactory.getInstance("SunX509");
            trustManagerFactory.init(keyStore);

            // SSLSocketFactory তৈরি করা
            SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

            // সার্ভারের সাথে সংযোগ স্থাপন
            SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket("localhost", 9999);
            sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});

            // সার্ভারের সাথে ইন্টারঅ্যাক্ট করা
            BufferedReader reader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
            PrintWriter writer = new PrintWriter(sslSocket.getOutputStream(), true);

            // ক্লায়েন্ট থেকে সার্ভারে মেসেজ পাঠানো
            writer.println("Hello from client!");

            // সার্ভার থেকে রেসপন্স গ্রহণ করা
            String serverResponse;
            while ((serverResponse = reader.readLine()) != null) {
                System.out.println("Received from server: " + serverResponse);
            }

            sslSocket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • SSLSocketFactory: এটি SSL কানেকশন তৈরি করতে ব্যবহৃত হয়।
  • SSL Client: ক্লায়েন্ট সার্ভারের সাথে নিরাপদভাবে সংযোগ করে এবং মেসেজ পাঠায়/গ্রহণ করে।

৩. KeyStore এবং TrustStore সেটআপ

এখানে KeyStore এবং TrustStore ব্যবহৃত হয়েছে, যা Java-এর সিকিউরিটি ম্যানেজমেন্টের অংশ। আপনি keytool কমান্ড ব্যবহার করে নিজের Keystore তৈরি করতে পারেন।

KeyStore তৈরি করা (Server):

keytool -genkey -keyalg RSA -alias serverkey -keystore server.jks -validity 3650

TrustStore তৈরি করা (Client):

keytool -import -file server.crt -keystore client.jks -alias server

এখানে server.jks হল সার্ভারের জন্য তৈরি করা KeyStore ফাইল এবং client.jks হল ক্লায়েন্টের জন্য তৈরি করা TrustStore ফাইল।

৪. আউটপুট

SSL Server (Server.java) চালানোর পর:

SSL Server started and waiting for client connection...
Client connected: /127.0.0.1
Received from client: Hello from client!

SSL Client (Client.java) চালানোর পর:

Received from server: SERVER RESPONSE: HELLO FROM CLIENT!

সারাংশ:

  • SSL (Secure Socket Layer) বা TLS (Transport Layer Security) হল একটি প্রোটোকল যা ইন্টারনেটের মাধ্যমে সুরক্ষিত যোগাযোগ নিশ্চিত করে।
  • Java-তে SSL যোগাযোগ তৈরি করতে SSLSocket, SSLServerSocket, KeyStore, এবং TrustStore ব্যবহার করা হয়।
  • এখানে ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদ SSL সংযোগ স্থাপন করা হয়েছে এবং টেক্সট বার্তা পাঠানো/গ্রহণ করা হয়েছে।

এই উদাহরণগুলোর মাধ্যমে আপনি Java-তে SSL বা TLS প্রোটোকল ব্যবহার করে নিরাপদ সংযোগ তৈরি করতে পারেন।

Content added By

Password Hashing Example: Password Hashing এর জন্য Java Security ব্যবহার

116
116

Java Security API ব্যবহার করে Password Hashing একটি গুরুত্বপূর্ণ নিরাপত্তা প্রযুক্তি, যা পাসওয়ার্ডগুলোকে নিরাপদভাবে স্টোর করার জন্য ব্যবহৃত হয়। এই প্রক্রিয়ায়, পাসওয়ার্ডগুলোকে সরাসরি সংরক্ষণ না করে, তাদের হ্যাশ করা হয়। হ্যাশিং একটি একমুখী প্রক্রিয়া, যার মাধ্যমে আপনি পাসওয়ার্ডের আসল মানটি পুনরুদ্ধার করতে পারবেন না, তবে সঠিক পাসওয়ার্ড ইনপুট দিলে একই হ্যাশ মান পাওয়া যাবে।

নিচে, Java Security API ব্যবহার করে পাসওয়ার্ড হ্যাশিং করার একটি উদাহরণ দেখানো হলো।

১. Password Hashing Using SHA-256

SHA-256 (Secure Hash Algorithm) একটি জনপ্রিয় হ্যাশিং অ্যালগরিদম যা পাসওয়ার্ড হ্যাশিংয়ের জন্য ব্যবহার করা হয়।

উদাহরণ: পাসওয়ার্ড হ্যাশিং এবং ভেরিফিকেশন

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class PasswordHashingExample {

    // পাসওয়ার্ড হ্যাশ করার মেথড
    public static String hashPassword(String password) throws NoSuchAlgorithmException {
        // SHA-256 অ্যালগরিদম ব্যবহার করে হ্যাশ তৈরি করা
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        
        // পাসওয়ার্ডের বাইটস পাবলিক আর্গুমেন্ট হিসেবে নিয়ে হ্যাশ তৈরি করা
        byte[] hashedBytes = messageDigest.digest(password.getBytes());
        
        // হ্যাশ বাইটসকে হেক্সাডেসিমাল স্ট্রিংয়ে রূপান্তর করা
        StringBuilder stringBuilder = new StringBuilder();
        for (byte b : hashedBytes) {
            stringBuilder.append(String.format("%02x", b));
        }
        
        // হ্যাশড পাসওয়ার্ড রিটার্ন করা
        return stringBuilder.toString();
    }

    // পাসওয়ার্ড এবং তার হ্যাশ মেলানো
    public static boolean verifyPassword(String originalPassword, String storedHash) throws NoSuchAlgorithmException {
        // পাসওয়ার্ড হ্যাশ করা
        String hashedPassword = hashPassword(originalPassword);
        
        // হ্যাশ মেলানো
        return hashedPassword.equals(storedHash);
    }

    public static void main(String[] args) {
        try {
            // পাসওয়ার্ড ইনপুট
            String password = "mySecurePassword";

            // পাসওয়ার্ড হ্যাশ করা
            String hashedPassword = hashPassword(password);
            System.out.println("Hashed Password: " + hashedPassword);
            
            // হ্যাশ ভেরিফিকেশন
            String inputPassword = "mySecurePassword";
            if (verifyPassword(inputPassword, hashedPassword)) {
                System.out.println("Password is correct.");
            } else {
                System.out.println("Password is incorrect.");
            }

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. MessageDigest ক্লাস:
    • এই ক্লাসটি বিভিন্ন হ্যাশিং অ্যালগরিদম (যেমন SHA-256) সমর্থন করে।
    • getInstance("SHA-256") দ্বারা SHA-256 অ্যালগরিদম ব্যবহার করা হচ্ছে।
  2. hashPassword() মেথড:
    • পাসওয়ার্ডের ইনপুট নিয়ে তার SHA-256 হ্যাশ তৈরি করে।
    • messageDigest.digest() মেথডটি পাসওয়ার্ডের বাইটস নিয়ে তাদের হ্যাশ বের করে।
    • তারপর, হ্যাশড বাইটসকে হেক্সাডেসিমাল স্ট্রিংয়ে রূপান্তর করা হয় যাতে এটি দেখতে সহজ হয় এবং ডেটাবেসে সংরক্ষণ করা যায়।
  3. verifyPassword() মেথড:
    • এটি ইনপুট পাসওয়ার্ডের হ্যাশ তৈরি করে এবং সেটি স্টোর করা হ্যাশের সাথে তুলনা করে পাসওয়ার্ডটি সঠিক কিনা যাচাই করে।
  4. main() মেথড:
    • প্রথমে একটি পাসওয়ার্ড হ্যাশ করা হয়।
    • পরে, একটি ইনপুট পাসওয়ার্ড নিয়ে সেটি হ্যাশ করা হয় এবং স্টোর করা হ্যাশের সাথে তুলনা করা হয়। যদি দুটি হ্যাশ এক হয়, তাহলে পাসওয়ার্ড সঠিক বলে ধরা হয়।

২. Password Hashing Using Salt (Additional Security)

পাসওয়ার্ড হ্যাশিংয়ে Salt ব্যবহার করলে, একে আরো নিরাপদ করা যায়। Salt হল একটি এলোমেলো স্ট্রিং যা পাসওয়ার্ডের সাথে যুক্ত করা হয়, যাতে একাধিক ব্যবহারকারীর একই পাসওয়ার্ড থাকা সত্ত্বেও তাদের হ্যাশ ভিন্ন হয়।

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class SaltedPasswordHashingExample {

    // Salt তৈরি করার মেথড
    public static String getSalt() {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[16];
        random.nextBytes(salt);
        return bytesToHex(salt);
    }

    // বাইটগুলোকে হেক্সাডেসিমাল স্ট্রিংয়ে রূপান্তর করার মেথড
    public static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            hexString.append(String.format("%02x", b));
        }
        return hexString.toString();
    }

    // পাসওয়ার্ড হ্যাশ করার মেথড (Salt সহ)
    public static String hashPasswordWithSalt(String password, String salt) throws NoSuchAlgorithmException {
        // SHA-256 অ্যালগরিদম ব্যবহার করা
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
        
        // পাসওয়ার্ড এবং salt একত্রে কনক্যাট করা
        messageDigest.update((password + salt).getBytes());
        
        // হ্যাশ তৈরি করা
        byte[] hashedBytes = messageDigest.digest();
        
        // হ্যাশ বাইটসকে হেক্সাডেসিমাল স্ট্রিংয়ে রূপান্তর করা
        return bytesToHex(hashedBytes);
    }

    public static void main(String[] args) {
        try {
            // পাসওয়ার্ড ইনপুট
            String password = "mySecurePassword";
            
            // Salt তৈরি করা
            String salt = getSalt();
            System.out.println("Generated Salt: " + salt);

            // Salt সহ পাসওয়ার্ড হ্যাশ করা
            String hashedPasswordWithSalt = hashPasswordWithSalt(password, salt);
            System.out.println("Hashed Password with Salt: " + hashedPasswordWithSalt);
            
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. Salt Generation:
    • Salt তৈরির জন্য SecureRandom ব্যবহার করা হয়েছে, যা নিরাপদভাবে এলোমেলো ডেটা তৈরি করে।
  2. Salt এবং Password Concatenation:
    • পাসওয়ার্ড এবং salt একত্রে যোগ করা হয় এবং তারপর তাদের হ্যাশ করা হয়।
  3. Salted Password Hashing:
    • Salt ব্যবহার করা হলে একই পাসওয়ার্ডের জন্য আলাদা হ্যাশ তৈরি হবে, যার ফলে এটি আরো নিরাপদ হয়ে ওঠে।

সারাংশ:

  • Password Hashing নিরাপদ পাসওয়ার্ড স্টোরিংয়ের জন্য অপরিহার্য। Java-তে MessageDigest ক্লাস ব্যবহার করে SHA-256 বা অন্যান্য হ্যাশিং অ্যালগরিদম দিয়ে পাসওয়ার্ড হ্যাশ করা যায়।
  • Salt ব্যবহার করলে নিরাপত্তা আরো বৃদ্ধি পায় এবং একই পাসওয়ার্ডের জন্য একাধিক ব্যবহারকারীর হ্যাশ আলাদা হয়।
  • হ্যাশিং প্রক্রিয়াটি একমুখী, অর্থাৎ পাসওয়ার্ডের আসল মান পুনরুদ্ধার করা সম্ভব নয়, কিন্তু আপনি হ্যাশকৃত পাসওয়ার্ডের সাথে নতুন পাসওয়ার্ডের হ্যাশ তুলনা করতে পারেন।
Content added By

Key Generation Example: Java তে KeyPair Generation এর উদাহরণ

152
152

Java তে KeyPair Generation এর উদাহরণ দেখানোর জন্য আমরা সাধারণত Java Cryptography Architecture (JCA) এর সাহায্য ব্যবহার করি। এখানে RSA (রিভেস্ট-শ্যামির-আলগোরিদম) কিপেয়ার (public/private key pair) তৈরি করার একটি উদাহরণ দেওয়া হল।

KeyPair Generation Example (RSA)

নিচে একটি উদাহরণ দেওয়া হয়েছে যেখানে একটি RSA কিপেয়ার তৈরি করা হচ্ছে:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class KeyPairGenerationExample {
    public static void main(String[] args) {
        try {
            // KeyPairGenerator তৈরি করুন
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            
            // RSA কিপেয়ার তৈরির জন্য নির্দিষ্ট শক্তি সেট করুন
            keyPairGenerator.initialize(2048, new SecureRandom());
            
            // কিপেয়ার তৈরি করুন
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            
            // পাবলিক এবং প্রাইভেট কিপাব্দ হস্তগত করুন
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
            
            // পাবলিক এবং প্রাইভেট কির চিত্র প্রদর্শন
            System.out.println("Public Key: " + publicKey);
            System.out.println("Private Key: " + privateKey);
        } catch (NoSuchAlgorithmException e) {
            System.out.println("Key generation algorithm not found: " + e.getMessage());
        }
    }
}

ব্যাখ্যা:

  1. KeyPairGenerator: এটি KeyPair তৈরি করতে ব্যবহৃত ক্লাস। আমরা এখানে "RSA" আলগোরিদম ব্যবহার করছি, তবে আপনি অন্যান্য আলগোরিদম যেমন DSA বা EC (Elliptic Curve) ব্যবহার করতে পারেন।
  2. initialize(): এই পদ্ধতি ব্যবহার করে আপনি কিপেয়ার তৈরির জন্য কী শক্তি (key strength) নির্ধারণ করতে পারেন। 2048-বিট RSA শক্তি এখানে ব্যবহার করা হয়েছে।
  3. generateKeyPair(): এই পদ্ধতি কিপেয়ার তৈরি করে এবং পাবলিক এবং প্রাইভেট কিপাব্দ প্রদান করে।
  4. PublicKey এবং PrivateKey: কিপেয়ার পাবলিক এবং প্রাইভেট অংশ বের করে।

RSA KeyPair সম্পর্কে:

  • Public Key: এটি আপনার কিপেয়ার প্যারটির পাবলিক অংশ। এটি দিয়ে আপনি এনক্রিপ্ট করতে পারেন বা সিগনেচার যাচাই করতে পারেন।
  • Private Key: এটি আপনার কিপেয়ার প্যারটির প্রাইভেট অংশ। এটি দিয়ে আপনি ডেটা ডিক্রিপ্ট করতে পারেন বা সিগনেচার তৈরি করতে পারেন।

এটি একটি মৌলিক উদাহরণ, এবং আপনি এই কিপেয়ার ব্যবহার করে এনক্রিপশন এবং সিগনেচার তৈরির মতো বিভিন্ন নিরাপত্তা ফিচার প্রয়োগ করতে পারেন।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion