Ik raad je aan om in de toekomst niet om antwoorden te smeken zonder eerst een code te tonen die je hebt geprobeerd.
Dat gezegd hebbende, ik bijt.
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();
}
}
Hier is een leuke en eenvoudige hulpklasse voor een hash/salt-functie. Zorg ervoor dat u dezelfde "salt"-tekenreeks gebruikt die is gemaakt toen de gebruiker werd gemaakt voor wanneer u de gebruiker verifieert, anders mislukt de verificatie.
Wat wachtwoorden betreft, vind ik het veiliger om een hash/salt-functie te gebruiken in plaats van encryptie, omdat de encryptie kan worden verbroken met de juiste publieke/private sleutel.
U kunt meer informatie vinden over Java's native encryptie Hier.
BEWERKEN
Zoals @james large opmerkte, moet je het zout willekeurig verdelen. Ik heb de code aangepast om dit weer te geven.
Bron van het bovenstaande voorbeeld:HowToDoInJava
Ik raad u dan aan om de salt en het gecodeerde wachtwoord door te geven aan de database wanneer u nieuwe gebruikers aanmaakt, en vervolgens een resultatenset te krijgen met de salt en het wachtwoord en deze in te voeren op een vergelijkbare methode als getSecurePassword()
en de uitkomst hiervan gebruiken als validatie.
Ik hoop dat dit helpt!
Bewerken - 2
Voeg nog een rij toe aan je tabel met de naam "salt" (of wat je maar wilt), en voeg een nieuwe gebruiker in met een PreparedStatement, zoals zo:
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();