Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einfache Passwortverschlüsselung – wie mache ich das?

In Zukunft würde ich vorschlagen, dass Sie nicht um Antworten betteln, ohne vorher Code zu zeigen, den Sie ausprobiert haben.

Davon abgesehen, beiße ich.

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 ist eine schöne und einfache Hilfsklasse für eine Hash/Salt-Funktion. Stellen Sie nur sicher, dass Sie dieselbe "Salz"-Zeichenfolge verwenden, die erstellt wurde, als der Benutzer erstellt wurde, wenn Sie den Benutzer authentifizieren, andernfalls schlägt die Authentifizierung fehl.

Wenn es um Passwörter geht, finde ich es sicherer, eine Hash-/Salt-Funktion anstelle einer Verschlüsselung zu verwenden, da die Verschlüsselung mit dem richtigen öffentlichen/privaten Schlüssel gebrochen werden kann.

Weitere Informationen zur nativen Verschlüsselung von Java finden Sie unter Hier.

BEARBEITEN

Wie @james large betonte, sollten Sie das Salz zufällig anordnen. Ich habe den Code geändert, um dies anzuzeigen.

Quelle des obigen Beispiels:HowToDoInJava

Ich würde dann vorschlagen, dass Sie das Salt und das verschlüsselte Passwort an die Datenbank übergeben, wenn Sie neue Benutzer erstellen, und dann ein Resultset erhalten, das das Salt und das Passwort enthält, und es in eine ähnliche Methode wie getSecurePassword() einspeisen und das Ergebnis davon als Validierung zu verwenden.

Ich hoffe, das hilft!

Bearbeiten - 2

Fügen Sie eine weitere Zeile mit dem Namen "salt" (oder was auch immer Sie möchten) in Ihre Tabelle ein und fügen Sie einen neuen Benutzer mit einem PreparedStatement ein, etwa so:

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