web-dev-qa-db-fra.com

Spring Security> 5.0.0 supprimé Md5PasswordEncoder

J'ai un projet Spring utilisant la sécurité Spring. J'utilisais Spring Boot 1.5 et maintenant j'ai migré vers Spring Boot 2.0.

J'ai remarqué que Md5PasswordEncoder a été supprimé de la version finale de Spring Security. À la place, Md4PasswordEncoder est toujours présent, même s'il est déconseillé ( https://docs.spring.io/spring-security/site/docs/5.0.3.RELEASE/api/ ).

Devrais-je utiliser un encodeur MD5 extenal ou la classe classée est-elle déplacée ailleurs?

3
drenda

Vous devriez utiliser org.springframework.security.crypto.password.PasswordEncoder à la place. Ici est un bon article sur le passage à la nouvelle interface.

3
Matteo Baldi

Le fait que Md5PasswordEncoder ait cessé d'exister ne signifie pas que Spring Security 5 ne peut pas créer de hachages MD5. Il utilise new MessageDigestPasswordEncoder("MD5") pour cela.

Il existe deux options, les deux fonctionnent avec la nouvelle DelegatingPasswordEncoder, qui attend un préfixe de mot de passe pour déterminer l'algorithme de hachage, par exemple {MD5}password_hash:

Soit définissez le codeur de mot de passe par défaut sur MD5 (en majuscule!). Par conséquent, si les mots de passe ne sont pas préfixés, le codeur par défaut est appliqué:

PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
passwordEncoder.setDefaultPasswordEncoderForMatches(new MessageDigestPasswordEncoder("MD5"));

ou préfixe le mot de passe existant dans la base de données avec {MD5}. De cette façon, la DelegatingPasswordEncoder délègue au hasher `MD5 '. Quelque chose comme:

update myusertable set pwd = '{MD5}' || pwd;
2
Markus Pscheidt

Spring supprimez MD5 car il n’est plus assez sécurisé. Vous devriez utiliser Bcrypt.

1
idan

Si vous souhaitez utiliser MD5, vous pouvez personnaliser:

@Bean
public PasswordEncoder passwordEncoder() {
    return new PasswordEncoder() {
        @Override
        public String encode(CharSequence charSequence) {
            return getMd5(charSequence.toString());
        }

        @Override
        public boolean matches(CharSequence charSequence, String s) {
            return getMd5(charSequence.toString()).equals(s);
        }
    };
}

public static String getMd5(String input) {
    try {
        // Static getInstance method is called with hashing SHA
        MessageDigest md = MessageDigest.getInstance("MD5");

        // digest() method called
        // to calculate message digest of an input
        // and return array of byte
        byte[] messageDigest = md.digest(input.getBytes());

        // Convert byte array into signum representation
        BigInteger no = new BigInteger(1, messageDigest);

        // Convert message digest into hex value
        String hashtext = no.toString(16);

        while (hashtext.length() < 32) {
            hashtext = "0" + hashtext;
        }

        return hashtext;
    }

    // For specifying wrong message digest algorithms
    catch (NoSuchAlgorithmException e) {
        System.out.println("Exception thrown"
                + " for incorrect algorithm: " + e);
        return null;
    }
}
0
TungHarry