Spring Security> 5.0.0已删除Md5PasswordEncoder

dre*_*nda 7 java spring spring-security spring-boot

我有一个使用Spring安全性的Spring项目。我当时使用的是Spring Boot 1.5,现在我迁移到了Spring Boot 2.0。

我注意到Md5PasswordEncoder在Spring Security的最终版本中已被删除。相反,Md4PasswordEncoder即使弃用仍然存在(https://docs.spring.io/spring-security/site/docs/5.0.3.RELEASE/api/)。

我应该使用扩展MD5编码器还是将分类移动到其他地方?

Mar*_*idt 6

这一事实Md5PasswordEncoder已不存在并不意味着春季安全5是无法创建MD5哈希。它new MessageDigestPasswordEncoder("MD5")用于此。

有两个选项,两个都与new一起使用DelegatingPasswordEncoder,它们需要一个密码前缀来确定哈希算法,例如{MD5}password_hash

可以将默认密码编码器设置为MD5(大写!),因此,如果密码没有前缀,则将应用默认编码器:

PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
passwordEncoder.setDefaultPasswordEncoderForMatches(new MessageDigestPasswordEncoder("MD5"));
Run Code Online (Sandbox Code Playgroud)

在数据库中为现有密码哈希添加前缀{MD5}。这样,DelegatingPasswordEncoder代表“ MD5”哈希器。就像是:

update myusertable set pwd = '{MD5}' || pwd;
Run Code Online (Sandbox Code Playgroud)


Mat*_*ldi 5

您应该org.springframework.security.crypto.password.PasswordEncoder改用。是一篇有关切换到新界面的好文章。


Tun*_*rry 5

如果要使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)