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?
Vous devriez utiliser org.springframework.security.crypto.password.PasswordEncoder
à la place. Ici est un bon article sur le passage à la nouvelle interface.
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;
Spring supprimez MD5 car il n’est plus assez sécurisé. Vous devriez utiliser Bcrypt.
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;
}
}