[英]How to configure passwordEncoder in spring security config if i use Md5PasswordEncoder for password encryption?
[英]Spring Security >5.0.0 removed Md5PasswordEncoder
我有一个使用Spring安全性的Spring项目。 我使用的是Spring Boot 1.5,现在我已迁移到Spring Boot 2.0。
我注意到在Spring Security的最终版本中删除了Md5PasswordEncoder 。 相反,即使弃用了Md4PasswordEncoder
( https://docs.spring.io/spring-security/site/docs/5.0.3.RELEASE/api/ )。
我应该使用extenal MD5编码器还是将其分类移动到其他地方?
Md5PasswordEncoder
不再存在这一事实并不意味着Spring Security 5无法创建MD5
哈希值。 它使用new MessageDigestPasswordEncoder("MD5")
。
有两个选项,都可以使用新的DelegatingPasswordEncoder
,它需要一个密码前缀来确定散列算法,例如{MD5}password_hash
:
无论是设置默认密码编码器MD5
(大写!),所以如果密码没有前缀,则应用默认编码器:
PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
passwordEncoder.setDefaultPasswordEncoderForMatches(new MessageDigestPasswordEncoder("MD5"));
或者使用{MD5}
为数据库中的现有密码哈希添加前缀。 这样DelegatingPasswordEncoder
委托给'MD5'hasher。 就像是:
update myusertable set pwd = '{MD5}' || pwd;
您应该使用org.springframework.security.crypto.password.PasswordEncoder
。 这是一篇关于切换到新界面的好文章。
如果您想使用MD5,您可以自定义:
@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;
}
}
Spring删除了MD5,因为它不再足够安全。 你应该使用Bcrypt。
我的解决方案如下:
protected static String mergePasswordAndSalt(String password, Object salt, boolean strict) {
if (password == null) {
password = "";
}
if ((strict) && (salt != null) && ((salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1))) {
throw new IllegalArgumentException("Cannot use { or } in salt.toString()");
}
if ((salt == null) || ("".equals(salt))) {
return password;
}
return password + "{" + salt.toString() + "}";
}
public static String EncodingPassword(String password, String salt) {
String merge = mergePasswordAndSalt(password,salt,false);
return DigestUtils.md5Hex(merge);
}
使用上面的函数替换下面的代码:
new Md5PasswordEncoder().encodePassword(String rawPass, Object salt);
从spring-security-core-3.1.4.RELEASE.jar中的Md5PasswordEncoder的源代码中,我们可以了解它如何处理密码和salt:
//org.springframework.security.authentication.encoding.BasePasswordEncoder.class
protected String mergePasswordAndSalt(String password, Object salt, boolean strict)
{
if (password == null) {
password = "";
}
if ((strict) && (salt != null) && (
(salt.toString().lastIndexOf("{") != -1) || (salt.toString().lastIndexOf("}") != -1))) {
throw new IllegalArgumentException("Cannot use { or } in salt.toString()");
}
if ((salt == null) || ("".equals(salt))) {
return password;
}
return password + "{" + salt.toString() + "}";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.