Mysql
 sql >> Base de données >  >> RDS >> Mysql

Cryptage simple du mot de passe - comment faire ?

À l'avenir, je vous suggère de vous abstenir de quémander des réponses sans d'abord montrer du code que vous avez essayé.

Cela étant dit, je vais mordre.

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

Voici une classe d'assistance simple et agréable pour une fonction de hachage/sel. Assurez-vous simplement d'utiliser la même chaîne "salt" créée lors de la création de l'utilisateur lorsque vous authentifiez l'utilisateur, sinon l'authentification échouera.

En ce qui concerne les mots de passe, je trouve plus sûr d'utiliser une fonction de hachage/sel plutôt qu'un chiffrement, car le chiffrement peut être brisé avec la bonne clé publique/privée.

Vous pouvez trouver plus d'informations sur le chiffrement natif de Java Ici.

MODIFIER

Comme @james large l'a souligné, vous devez randomiser le sel. J'ai modifié le code pour le montrer.

Source de l'exemple ci-dessus :HowToDoInJava

Je vous suggérerais ensuite de transmettre le sel et le mot de passe crypté à la base de données lors de la création de nouveaux utilisateurs, puis d'obtenir un jeu de résultats contenant le sel et le mot de passe et de l'introduire dans une méthode similaire à getSecurePassword() et en utilisant le résultat comme une validation.

J'espère que cela vous aidera !

Modifier - 2

Insérez une autre ligne dans votre table appelée "salt" (ou ce que vous voulez), et insérez un nouvel utilisateur avec un PreparedStatement, comme ceci :

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