Password Hashing এবং Salt হল দুটি গুরুত্বপূর্ণ কৌশল যা ব্যবহারকারীদের পাসওয়ার্ড সুরক্ষিত রাখতে ব্যবহৃত হয়। Hashing একটি একমুখী প্রক্রিয়া যা পাসওয়ার্ড বা অন্য যেকোনো তথ্যকে নির্দিষ্ট দৈর্ঘ্যের হ্যাশ কোডে রূপান্তর করে, এবং Salt হচ্ছে একটি র্যান্ডম মান যা হ্যাশিং প্রক্রিয়ায় যুক্ত করা হয়, যা অতিরিক্ত সুরক্ষা প্রদান করে।
Java Cryptography API ব্যবহার করে Password Hashing এবং Salt ব্যবহার করা যায় যাতে পাসওয়ার্ড সুরক্ষিত থাকে এবং ব্রুট-ফোর্স আক্রমণ বা Rainbow Table আক্রমণ থেকে রক্ষা পাওয়া যায়।
1. Password Hashing (পাসওয়ার্ড হ্যাশিং)
Password Hashing হল পাসওয়ার্ড বা অন্যান্য গুরুত্বপূর্ণ ডেটা এমনভাবে রূপান্তর করার প্রক্রিয়া যাতে সেগুলি মূল অবস্থায় ফিরিয়ে আনা সম্ভব না হয়। Hashing হল একটি একমুখী ক্রিপ্টোগ্রাফিক ফাংশন যা একটি ইনপুট (যেমন পাসওয়ার্ড) গ্রহণ করে এবং সেটিকে একটি নির্দিষ্ট দৈর্ঘ্যের স্ট্রিং-এ রূপান্তরিত করে।
Common Hashing Algorithms:
- MD5 (অ্যাডভান্সড সিকিউরিটি জন্য ব্যবহার না করা হয়, কারণ এটি দ্রুত এবং অতি সহজে brute force আক্রমণ করা যায়)
- SHA-256 (আরও নিরাপদ এবং জনপ্রিয়)
- PBKDF2, bcrypt, scrypt (এইগুলি বিশেষভাবে পাসওয়ার্ড হ্যাশিংয়ের জন্য তৈরি করা হয়েছে এবং বেশ নিরাপদ)
Java Cryptography API তে MessageDigest ক্লাস ব্যবহার করে পাসওয়ার্ড হ্যাশিং করা যেতে পারে।
Example: Password Hashing using SHA-256
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class PasswordHashingExample {
public static void main(String[] args) throws NoSuchAlgorithmException {
// Input password
String password = "MySecurePassword123";
// Create a MessageDigest instance for SHA-256 hashing
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// Hash the password
byte[] hashedBytes = digest.digest(password.getBytes());
// Convert the hashed bytes into hexadecimal format
StringBuilder hexString = new StringBuilder();
for (byte b : hashedBytes) {
hexString.append(String.format("%02x", b));
}
System.out.println("Hashed Password: " + hexString.toString());
}
}
Output Example:
Hashed Password: 7e8f8a77fc5ff9511f5a572f7cdb9d130dfb97b9d4b313bdb4c24dff64c409b8
Explanation:
- এখানে, SHA-256 অ্যালগরিদম ব্যবহার করে পাসওয়ার্ড হ্যাশ করা হয়েছে।
- হ্যাশড পাসওয়ার্ড একটি নির্দিষ্ট দৈর্ঘ্যের হ্যাশ স্ট্রিং-এ রূপান্তরিত হয়ে সিস্টেমে সংরক্ষণ করা যাবে।
2. Salt এর ব্যবহার
Salt হল একটি র্যান্ডম ডেটা যা পাসওয়ার্ড হ্যাশিং প্রক্রিয়ার মধ্যে যোগ করা হয়। এটি মূলত হ্যাশিংয়ের আগে পাসওয়ার্ডের সাথে যোগ করা হয় এবং এটি ব্রুট-ফোর্স বা Rainbow Table আক্রমণ থেকে পাসওয়ার্ডের সুরক্ষা বাড়ায়। সঠিকভাবে তৈরি করা salt আক্রমণকারীদের জন্য সিস্টেমের পাসওয়ার্ড হ্যাশ সমূহ অনুমান করা কঠিন করে তোলে।
Salt এর সুবিধা:
- Rainbow Table Attack প্রতিরোধ: প্রতিটি ব্যবহারকারীর পাসওয়ার্ডে আলাদা salt যোগ করা হলে, Rainbow Tables তৈরি করা কঠিন হয়ে পড়ে।
- Brute Force Attacks প্রতিরোধ: Salt যুক্ত পাসওয়ার্ড হ্যাশগুলো একেকটি ভিন্ন হ্যাশ তৈরি করে, তাই আক্রমণকারী একটি সাধারণ পাসওয়ার্ডের জন্য বিভিন্ন হ্যাশ তৈরি করতে বাধ্য হয়।
Salt প্রক্রিয়া:
- পাসওয়ার্ড নেওয়া হয়।
- একটি র্যান্ডম salt তৈরি করা হয়।
- পাসওয়ার্ড এবং salt একত্রিত হয়ে হ্যাশ করা হয়।
- হ্যাশ এবং salt সংরক্ষণ করা হয়, কিন্তু পাসওয়ার্ড কখনও সংরক্ষণ করা হয় না।
Example: Password Hashing with Salt
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
public class SaltedPasswordHashingExample {
public static void main(String[] args) throws NoSuchAlgorithmException {
// Input password
String password = "MySecurePassword123";
// Create a SecureRandom instance for generating salt
SecureRandom secureRandom = new SecureRandom();
// Create a salt (16 bytes long)
byte[] salt = new byte[16];
secureRandom.nextBytes(salt);
// Convert salt to a readable format
String saltString = Base64.getEncoder().encodeToString(salt);
// Hash the password with the salt using SHA-256
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(salt); // Add the salt to the hashing process
byte[] hashedBytes = digest.digest(password.getBytes());
// Convert the hashed bytes into hexadecimal format
StringBuilder hexString = new StringBuilder();
for (byte b : hashedBytes) {
hexString.append(String.format("%02x", b));
}
// Print the salt and hashed password
System.out.println("Salt: " + saltString);
System.out.println("Hashed Password with Salt: " + hexString.toString());
}
}
Output Example:
Salt: +Y0e4JZZFbo6n3+k8FZ3lA==
Hashed Password with Salt: 62e4d38c0e87b8d364d61a23b6f5e9919b431e23c5766b185b3e09fd7d4b6db2
Explanation:
- এখানে SecureRandom ব্যবহার করে salt তৈরি করা হয়েছে এবং এটি পাসওয়ার্ডের সাথে যুক্ত করা হয়েছে হ্যাশিংয়ের জন্য।
- Base64 এ salt এর মান কনভার্ট করা হয়েছে যাতে এটি সংরক্ষণ করা যায়।
- হ্যাশিংয়ের পরে, পাসওয়ার্ডের সাথে সংশ্লিষ্ট salt এবং hashed password সিস্টেমে সংরক্ষণ করা হবে।
3. Salt এবং Hashing এর ব্যবহারের শ্রেষ্ঠ প্রয়োগ (Best Practices)
- Salt এর দৈর্ঘ্য:
- Salt সাধারণত কমপক্ষে 16 বাইট দীর্ঘ হওয়া উচিত। এটি যথেষ্ট বড় হওয়া উচিত যাতে আক্রমণকারীরা এটি অনুমান করতে না পারে।
- Unique Salt প্রতি পাসওয়ার্ড:
- প্রতিটি পাসওয়ার্ডের জন্য একটি আলাদা salt ব্যবহার করা উচিত। একটি ইউনিক salt এর মাধ্যমে Rainbow Table attacks প্রতিরোধ করা যায়।
- Strong Hashing Algorithm:
- bcrypt, PBKDF2, বা scrypt এর মতো শক্তিশালী হ্যাশিং অ্যালগরিদম ব্যবহার করুন, কারণ এগুলি salt এবং key stretching এর সুবিধা প্রদান করে, যা হ্যাশিং প্রক্রিয়াকে আরো নিরাপদ করে।
- Store Salt and Hash Separately:
- Salt এবং hashed password আলাদাভাবে সুরক্ষিত করতে হবে, যাতে salt এর ব্যবহারে হ্যাশিংয়ের নিরাপত্তা বৃদ্ধি পায়।
- Key Stretching:
- PBKDF2 বা bcrypt এর মতো অ্যালগরিদমগুলি key stretching প্রক্রিয়া ব্যবহৃত করে, যা একাধিক বার হ্যাশিং করে এবং আক্রমণকারীদের জন্য ব্রুট-ফোর্স আক্রমণ কঠিন করে তোলে।
Password Hashing এবং Salt হল পাসওয়ার্ড সুরক্ষায় গুরুত্বপূর্ণ দুটি প্রক্রিয়া। Hashing পাসওয়ার্ডকে নিরাপদে রূপান্তরিত করে এবং Salt ব্যবহার করে Rainbow Table এবং Brute Force আক্রমণ প্রতিরোধ করা হয়। Java তে MessageDigest এবং SecureRandom ক্লাস ব্যবহার করে এই প্রক্রিয়াগুলি বাস্তবায়িত করা যায়। bcrypt, PBKDF2, এবং scrypt এর মতো শক্তিশালী হ্যাশিং অ্যালগরিদমগুলি ব্যবহার করে পাসওয়ার্ড হ্যাশিং নিরাপদ এবং কার্যকরী করা যেতে পারে।
Read more