sql >> Database teknologi >  >> RDS >> Mysql

Enkel adgangskodekryptering - hvordan gør jeg?

Fremover vil jeg foreslå, at du afstår fra at tigge om svar uden først at vise en kode, du har prøvet.

Når det er sagt, så bider jeg.

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

Her er en fin og enkel hjælperklasse til en hash/salt funktion. Bare sørg for at bruge den samme "salt"-streng, som blev oprettet, da brugeren blev oprettet til, når du godkender brugeren, ellers vil godkendelsen mislykkes.

Når det gælder adgangskoder, finder jeg det mere sikkert at bruge en hash/salt-funktion frem for kryptering, da kryptering kan brydes med den korrekte offentlige/private nøgle.

Du kan finde flere oplysninger om Javas oprindelige kryptering Her.

REDIGER

Som @james large påpegede, bør du randomisere saltet. Jeg har ændret koden for at vise dette.

Kilde til ovenstående eksempel:HowToDoInJava

Jeg vil så foreslå, at du sender saltet og det krypterede kodeord til databasen, når du opretter nye brugere, og derefter får et resultatsæt indeholdende saltet og adgangskoden og indlæser det i en lignende metode som getSecurePassword() og bruge resultatet af dette som en validering.

Jeg håber, at dette hjælper!

Rediger - 2

Indsæt endnu en række i din tabel kaldet "salt" (eller hvad du nu kan lide), og indsæt en ny bruger med en PreparedStatement, sådan:

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. StrongLoop:EmbedsMany vs hasMany og belongTo

  2. MySQL Hosting på Azure, Fuldt administreret Cloud Database Service lanceres på ScaleGrid

  3. Har ikke databaselås! i android

  4. Hentning af hierarkidata fra selvrefererende tabeller