Spring Security обеспечивает несколько PasswordEncoder
реализации с BCRYPT
в качестве рекомендуемой реализации. Однако в этой статье рассматривается вариант использования совместного использования базы данных аутентификации с внешним приложением Dovecot . Dovecot использует алгоритм MD5-CRYPT
.
Предоставляется полный javadoc .
Ссылка
Фактический алгоритм шифрования записан в исходном файле Dovecot password-scheme-md5crypt.c
.
Реализация
Реализация расширяет Делегирование кодировщика паролей
для предоставления услуг дешифрования для других типов паролей, поддерживаемых Spring Security. Два внутренних класса, каждый из подклассов PasswordEncoder
, предоставить MD5-КРИПТУ
и ПРОСТЫЕ
реализации.
@Service public class MD5CryptPasswordEncoder extends DelegatingPasswordEncoder { ... private static final String MD5_CRYPT = "MD5-CRYPT"; private static final HashMapMAP = new HashMap<>(); static { MAP.put(MD5_CRYPT, MD5Crypt.INSTANCE); MAP.put("CLEAR", NoCrypt.INSTANCE); MAP.put("CLEARTEXT", NoCrypt.INSTANCE); MAP.put("PLAIN", NoCrypt.INSTANCE); MAP.put("PLAINTEXT", NoCrypt.INSTANCE); } ... public MD5CryptPasswordEncoder() { super(MD5_CRYPT, MAP); setDefaultPasswordEncoderForMatches(PasswordEncoderFactories.createDelegatingPasswordEncoder()); } private static class NoCrypt implements PasswordEncoder { ... public static final NoCrypt INSTANCE = new NoCrypt(); ... } private static class MD5Crypt extends NoCrypt { ... public static final MD5Crypt INSTANCE = new MD5Crypt(); ... } }
Реализация внутреннего класса MD5Crypt
проста:
private static class MD5Crypt extends NoCrypt { private static final String MD5 = "md5"; private static final String MAGIC = "$1$"; private static final int SALT_LENGTH = 8; public static final MD5Crypt INSTANCE = new MD5Crypt(); public MD5Crypt() { } @Override public String encode(CharSequence raw) { return encode(raw.toString(), salt(SALT_LENGTH)); } private String encode(String raw, String salt) { if (salt.length() > SALT_LENGTH) { salt = salt.substring(0, SALT_LENGTH); } return (MAGIC + salt + "$" + encode(raw.getBytes(UTF_8), salt.getBytes(UTF_8))); } private String encode(byte[] password, byte[] salt) { /* * See source and password-scheme-md5crypt.c. */ } @Override public boolean matches(CharSequence raw, String encoded) { String salt = null; if (encoded.startsWith(MAGIC)) { salt = encoded.substring(MAGIC.length()).split("[$]")[0]; } else { throw new IllegalArgumentException("Invalid format"); } return encoded.equals(encode(raw.toString(), salt)); } }
Реализация NoCrypt
предоставляет методы вычисления соли и преобразования itoa64
.
Интеграция приложений Spring Boot
PasswordEncoder
может быть интегрирован со следующей @конфигурацией
:
package some.application; import ball.spring.MD5CryptPasswordEncoder; import ... @Configuration public class PasswordEncoderConfiguration { ... @Bean public PasswordEncoder passwordEncoder() { return new MD5CryptPasswordEncoder(); } }
и должен быть интегрирован с UserDetailsService
в websecurityconfigureradapter
:
package some.application; import ... @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfigurerImpl extends WebSecurityConfigurerAdapter { ... @Autowired private UserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService) .passwordEncoder(passwordEncoder); } ... }
Оригинал: “https://dev.to/allenball/spring-passwordencoder-implementation-3edf”