sql >> Databasteknik >  >> RDS >> Mysql

Enkel lösenordskryptering - hur gör jag?

I framtiden skulle jag föreslå att du avstår från att tigga om svar utan att först visa någon kod du har provat.

Som sagt, jag biter.

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

Här är en trevlig och enkel hjälparklass för en hash/saltfunktion. Se bara till att använda samma "salt"-sträng som skapades när användaren skapades för när du autentisera användaren, annars misslyckas autentiseringen.

När det gäller lösenord tycker jag att det är säkrare att använda en hash/salt-funktion snarare än kryptering, eftersom kryptering kan brytas med rätt offentlig/privat nyckel.

Du kan hitta mer information om Javas inbyggda kryptering Här.

REDIGERA

Som @james large påpekade, bör du randomisera saltet. Jag har ändrat koden för att visa detta.

Källa till exemplet ovan:HowToDoInJava

Jag skulle då föreslå att du skickar saltet och det krypterade lösenordet till databasen när du skapar nya användare och sedan får en resultatuppsättning som innehåller saltet och lösenordet och matar in det i en liknande metod som getSecurePassword() och använda resultatet av detta som en validering.

Jag hoppas att detta hjälper!

Redigera - 2

Infoga en annan rad i din tabell som heter "salt" (eller vad du vill) och infoga en ny användare med en PreparedStatement, så här:

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. Rails 3 SQL-frågaval med joins

  2. Ändra Django databas backend från MySql till PostgreSQL

  3. Oracle:Kombinera flera resultat i en underfråga till ett enda kommaseparerat värde

  4. mysql triggerproblem i fel schema