sql >> Database >  >> RDS >> Mysql

Eenvoudige wachtwoordcodering - hoe moet ik dat doen?

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();



  1. Hoe het 'as'-sleutelwoord te gebruiken om een ​​​​tabel in Oracle te aliasen?

  2. FOUT:het laden van lokale gegevens is uitgeschakeld - dit moet zowel aan de client- als aan de serverzijde zijn ingeschakeld

  3. Hoe verbinding maken met een MySQL-database vanaf een iPhone?

  4. DbUpdateConcurrencyException met Entity Framework 6 met MySql