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();
}
}
}
ব্যাখ্যা:
MessageDigestক্লাস:- এই ক্লাসটি বিভিন্ন হ্যাশিং অ্যালগরিদম (যেমন SHA-256) সমর্থন করে।
getInstance("SHA-256")দ্বারা SHA-256 অ্যালগরিদম ব্যবহার করা হচ্ছে।
hashPassword()মেথড:- পাসওয়ার্ডের ইনপুট নিয়ে তার SHA-256 হ্যাশ তৈরি করে।
messageDigest.digest()মেথডটি পাসওয়ার্ডের বাইটস নিয়ে তাদের হ্যাশ বের করে।- তারপর, হ্যাশড বাইটসকে হেক্সাডেসিমাল স্ট্রিংয়ে রূপান্তর করা হয় যাতে এটি দেখতে সহজ হয় এবং ডেটাবেসে সংরক্ষণ করা যায়।
verifyPassword()মেথড:- এটি ইনপুট পাসওয়ার্ডের হ্যাশ তৈরি করে এবং সেটি স্টোর করা হ্যাশের সাথে তুলনা করে পাসওয়ার্ডটি সঠিক কিনা যাচাই করে।
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();
}
}
}
ব্যাখ্যা:
- Salt Generation:
- Salt তৈরির জন্য
SecureRandomব্যবহার করা হয়েছে, যা নিরাপদভাবে এলোমেলো ডেটা তৈরি করে।
- Salt তৈরির জন্য
- Salt এবং Password Concatenation:
- পাসওয়ার্ড এবং salt একত্রে যোগ করা হয় এবং তারপর তাদের হ্যাশ করা হয়।
- Salted Password Hashing:
- Salt ব্যবহার করা হলে একই পাসওয়ার্ডের জন্য আলাদা হ্যাশ তৈরি হবে, যার ফলে এটি আরো নিরাপদ হয়ে ওঠে।
সারাংশ:
- Password Hashing নিরাপদ পাসওয়ার্ড স্টোরিংয়ের জন্য অপরিহার্য। Java-তে
MessageDigestক্লাস ব্যবহার করে SHA-256 বা অন্যান্য হ্যাশিং অ্যালগরিদম দিয়ে পাসওয়ার্ড হ্যাশ করা যায়। - Salt ব্যবহার করলে নিরাপত্তা আরো বৃদ্ধি পায় এবং একই পাসওয়ার্ডের জন্য একাধিক ব্যবহারকারীর হ্যাশ আলাদা হয়।
- হ্যাশিং প্রক্রিয়াটি একমুখী, অর্থাৎ পাসওয়ার্ডের আসল মান পুনরুদ্ধার করা সম্ভব নয়, কিন্তু আপনি হ্যাশকৃত পাসওয়ার্ডের সাথে নতুন পাসওয়ার্ডের হ্যাশ তুলনা করতে পারেন।
Read more