Sensitive Data Protection বা সেন্সিটিভ ডেটা সুরক্ষা এমন একটি প্রক্রিয়া যা নিশ্চিত করে যে ব্যক্তিগত, আর্থিক, স্বাস্থ্য সংক্রান্ত বা অন্য যেকোনো ধরনের গোপনীয় ডেটা সুরক্ষিত এবং নিরাপদ থাকে। Java MySQL অ্যাপ্লিকেশনগুলিতে এই সুরক্ষা নিশ্চিত করার জন্য বিভিন্ন টেকনিক ব্যবহার করা যায়, যেমন এনক্রিপশন, ডেটা মাস্কিং, অথেনটিকেশন, এবং অথরাইজেশন।
১. এনক্রিপশন (Encryption)
এনক্রিপশন হল একটি প্রক্রিয়া যা ডেটাকে এমনভাবে রূপান্তরিত করে যাতে সেটি কেবলমাত্র বিশেষ অনুমোদিত ব্যবহারকারী বা অ্যাপ্লিকেশনই পড়তে পারে। ডেটাবেসের sensitive ডেটা যেমন পাসওয়ার্ড, ক্রেডিট কার্ড নম্বর, সামাজিক সিকিউরিটি নম্বর ইত্যাদি এনক্রিপ্ট করা উচিত।
১.১ ডেটাবেসে স্টোর করার জন্য এনক্রিপশন
MySQL ডেটাবেসে সেনসিটিভ ডেটা স্টোর করার সময় এনক্রিপশন ব্যবহার করা উচিত। AES (Advanced Encryption Standard) একটি জনপ্রিয় এনক্রিপশন অ্যালগরিদম যা MySQL এবং Java-তে ব্যবহার করা যায়।
Java এনক্রিপশন উদাহরণ:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class EncryptionUtil {
private static final String ALGORITHM = "AES";
// এনক্রিপ্ট করার পদ্ধতি
public static String encrypt(String data, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedData);
}
// ডিক্রিপ্ট করার পদ্ধতি
public static String decrypt(String encryptedData, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
byte[] decryptedData = cipher.doFinal(decodedData);
return new String(decryptedData);
}
public static void main(String[] args) throws Exception {
String key = "1234567890123456"; // 16-byte key for AES-128
String data = "SensitiveData123";
// এনক্রিপ্ট করা
String encryptedData = encrypt(data, key);
System.out.println("Encrypted Data: " + encryptedData);
// ডিক্রিপ্ট করা
String decryptedData = decrypt(encryptedData, key);
System.out.println("Decrypted Data: " + decryptedData);
}
}
ব্যাখ্যা:
- AES Encryption ব্যবহার করে সেনসিটিভ ডেটা এনক্রিপ্ট করা হচ্ছে।
encryptএবংdecryptপদ্ধতি ডেটাকে এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য ব্যবহৃত হচ্ছে।
১.২ MySQL এ স্টোর করার জন্য এনক্রিপশন
MySQL 5.7+ থেকে AES_ENCRYPT এবং AES_DECRYPT ফাংশন ব্যবহার করা যায়, যেগুলি ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে সহায়তা করে।
MySQL কোড উদাহরণ:
-- Encrypt data before inserting
INSERT INTO users (username, password)
VALUES ('user1', AES_ENCRYPT('password123', 'encryption_key'));
-- Decrypt data when fetching
SELECT username, AES_DECRYPT(password, 'encryption_key') AS decrypted_password FROM users;
ব্যাখ্যা:
AES_ENCRYPTফাংশন দিয়ে পাসওয়ার্ড বা সেনসিটিভ ডেটা এনক্রিপ্ট করা হয়।AES_DECRYPTদিয়ে ডেটা ডিক্রিপ্ট করা হয়।
২. ডেটা মাস্কিং (Data Masking)
ডেটা মাস্কিং হল একটি প্রক্রিয়া যার মাধ্যমে সেনসিটিভ ডেটা শুধুমাত্র নির্দিষ্ট অংশটি প্রদর্শিত হয়, বাকী অংশটি গোপন রাখা হয়। এটি মূলত ডেটাবেসের মধ্যে ডেটা প্রক্রিয়াকরণের সময় অবাঞ্ছিত অ্যাক্সেস প্রতিরোধ করে।
২.১ ডেটা মাস্কিং উদাহরণ
যেমন, পাসওয়ার্ড বা ক্রেডিট কার্ড নম্বরের শেষ চারটি ডিজিট বাদে বাকী সংখ্যাগুলো মাস্ক করা:
public class DataMaskingUtil {
// মাস্ক করার পদ্ধতি
public static String maskData(String data) {
if (data.length() <= 4) {
return data; // If data is too short, return as is
}
String masked = "****" + data.substring(data.length() - 4);
return masked;
}
public static void main(String[] args) {
String sensitiveData = "1234567890123456"; // Example credit card number
String maskedData = maskData(sensitiveData);
System.out.println("Masked Data: " + maskedData); // Output: ****3456
}
}
ব্যাখ্যা:
- শুধুমাত্র শেষ ৪টি ডিজিট প্রকাশ পাবে, বাকি অংশটি মাস্ক করা হবে।
৩. অথেনটিকেশন এবং অথরাইজেশন (Authentication and Authorization)
সেন্সিটিভ ডেটা সুরক্ষিত রাখার জন্য অথেনটিকেশন এবং অথরাইজেশন অত্যন্ত গুরুত্বপূর্ণ। এগুলি নিশ্চিত করে যে ডেটাতে অ্যাক্সেস শুধুমাত্র অনুমোদিত ব্যবহারকারীরা পেতে পারে এবং তাদের নির্দিষ্ট অধিকার অনুযায়ী ডেটাতে কাজ করতে পারে।
৩.১ JWT (JSON Web Token) ব্যবহার করা
JWT (JSON Web Token) হল একটি পদ্ধতি যা ব্যবহারকারীর অথেনটিকেশন এবং অথরাইজেশন নিশ্চিত করতে ব্যবহৃত হয়।
Java উদাহরণ (JWT তৈরি করা):
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JWTUtil {
private static final String SECRET_KEY = "your_secret_key";
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1 hour expiration
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static void main(String[] args) {
String token = generateToken("user1");
System.out.println("Generated JWT: " + token);
}
}
ব্যাখ্যা:
- JWT তৈরি করে ইউজারের অথেনটিকেশন নিশ্চিত করা হয়, যাতে কোনো ব্যবহারকারী secret key দিয়ে ডেটাবেসের সেনসিটিভ ডেটাতে অ্যাক্সেস পেতে না পারে।
৪. SQL ইনজেকশন প্রতিরোধ
SQL ইনজেকশন হল একটি নিরাপত্তা ঝুঁকি, যা অ্যাপ্লিকেশনটি ব্যবহারের মাধ্যমে ডেটাবেসের সেনসিটিভ ডেটা চুরি করতে পারে। এটি প্রতিরোধ করতে parameterized queries ব্যবহার করা উচিত, যা ইনপুট ডেটা নিরাপদে প্রসেস করে।
৪.১ Parameterized Queries উদাহরণ
import java.sql.*;
public class SQLInjectionProtection {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/your_database";
String username = "root";
String password = "root_password";
Connection connection = DriverManager.getConnection(url, username, password);
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, "user1");
preparedStatement.setString(2, "password123");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println("User found: " + resultSet.getString("username"));
}
}
}
ব্যাখ্যা:
- PreparedStatement ব্যবহার করা হয়েছে, যা SQL ইনজেকশন থেকে ডেটাবেসকে সুরক্ষিত রাখে। এখানে ইনপুট ডেটা সরাসরি SQL কুইরির মধ্যে ঢোকানো হয়নি।
সারাংশ
Java MySQL অ্যাপ্লিকেশনে সেনসিটিভ ডেটা সুরক্ষা নিশ্চিত করতে বেশ কিছু টেকনিক ব্যবহার করা যেতে পারে, যেমন এনক্রিপশন, ডেটা মাস্কিং, অথেনটিকেশন এবং অথরাইজেশন, SQL ইনজেকশন প্রতিরোধ। এনক্রিপশন ডেটাকে সুরক্ষিত রাখে,
Read more