Trong tương lai, tôi khuyên bạn không nên cầu xin câu trả lời mà không hiển thị một số mã bạn đã thử trước.
Điều đó đang được nói, tôi sẽ cắn.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
public class EncryptHelper
{
public static String ehashAndSalt(String passedpass) throws NoSuchAlgorithmException, NoSuchProviderException
{
String passwordToHash = "password";
String salt = getSalt();
String securePassword = getSecurePassword(passwordToHash, salt);
return securePassword;
}
private static String getSecurePassword(String passwordToHash, String salt)
{
String generatedPassword = null;
try
{
// Create MessageDigest instance for MD5
MessageDigest md = MessageDigest.getInstance("MD5");
//Add password bytes to digest
md.update(salt.getBytes());
//Get the hash's bytes
byte[] bytes = md.digest(passwordToHash.getBytes());
//This bytes[] has bytes in decimal format;
//Convert it to hexadecimal format
StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++)
{
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
//Get complete hashed password in hex format
generatedPassword = sb.toString();
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
return generatedPassword;
}
//Add salt
private static String getSalt() throws NoSuchAlgorithmException, NoSuchProviderException
{
//Always use a SecureRandom generator
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
//Create array for salt
byte[] salt = new byte[16];
//Get a random salt
sr.nextBytes(salt);
//return salt
return salt.toString();
}
}
Đây là một lớp trợ giúp đơn giản và hay cho một hàm băm / muối. Chỉ cần đảm bảo sử dụng cùng một chuỗi "muối" được tạo khi người dùng được tạo khi bạn xác thực người dùng, nếu không quá trình xác thực sẽ không thành công.
Khi có liên quan đến mật khẩu, tôi thấy sử dụng hàm băm / muối sẽ an toàn hơn là sử dụng mã hóa, vì mã hóa có thể bị phá vỡ bằng đúng khóa công khai / riêng tư.
Bạn có thể tìm thêm thông tin về mã hóa Native của Java Đây.
CHỈNH SỬA
Như @james big đã chỉ ra, Bạn nên ngẫu nhiên hóa muối. Tôi đã sửa đổi mã để hiển thị điều này.
Nguồn của ví dụ trên: HowToDoInJava
Sau đó, tôi sẽ đề nghị bạn chuyển muối và mật khẩu được mã hóa vào cơ sở dữ liệu khi tạo người dùng mới, sau đó nhận tập kết quả có chứa muối và mật khẩu và đưa nó vào một phương thức tương tự với getSecurePassword()
và sử dụng kết quả của việc này làm xác nhận.
Tôi hy vọng điều này sẽ hữu ích!
Chỉnh sửa - 2
Chèn một hàng khác vào bảng của bạn có tên là "salt" (hoặc bất cứ thứ gì bạn thích) và chèn một người dùng mới với PreparedStatement, như sau:
Các giá trịPreparedStatement pstmnt = connection.prepareStatement
("insert into Usernames(`ID`,`Username`,`Password`,`Account type`, `salt`) values (?,?,?,?,?,)");
pstmnt.setInt(1, id); //would ideally be auto-incremented
pstmnt.setString(2, user); //user String obtained by any means
pstmnt.setString(3, securePassword); //from the hash/salt example above
pstmnt.setString(4, accType); //whatever naming structure you have for account types
pstmnt.setString(5, salt); //from the above example also.
pstmnt.executeUpdate();