W przyszłości sugeruję powstrzymanie się od błagania o odpowiedzi bez uprzedniego pokazania jakiegoś wypróbowanego kodu.
Biorąc to pod uwagę, ugryzę.
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();
}
}
Oto ładna i prosta klasa pomocnicza dla funkcji hash/salt. Tylko pamiętaj, aby użyć tego samego ciągu „sól”, który został utworzony podczas tworzenia użytkownika, w celu uwierzytelnienia użytkownika, w przeciwnym razie uwierzytelnianie się nie powiedzie.
Jeśli chodzi o hasła, uważam, że bezpieczniej jest używać funkcji skrótu/soli niż szyfrowania, ponieważ szyfrowanie można złamać za pomocą prawidłowego klucza publicznego/prywatnego.
Więcej informacji na temat natywnego szyfrowania Java można znaleźć Tutaj.
EDYTUJ
Jak zauważył @james large, sól należy posortować losowo. Zmieniłem kod, aby to pokazać.
Źródło powyższego przykładu:HowToDoInJava
Sugerowałbym wtedy przekazanie soli i zaszyfrowanego hasła do bazy danych podczas tworzenia nowych użytkowników, a następnie pobranie zestawu wyników zawierającego sól i hasło i podanie go w podobną metodę do getSecurePassword()
i wykorzystanie wyniku tego jako walidacji.
Mam nadzieję, że to pomoże!
Edytuj - 2
Wstaw do tabeli kolejny wiersz o nazwie „sól” (lub cokolwiek chcesz) i wstaw nowego użytkownika z przygotowanym oświadczeniem, na przykład:
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();