Многофакторная аутентификация (MFA) — это метод защиты, при котором пользователь должен предоставить два или более независимых фактора для подтверждения своей личности. Эти факторы обычно делятся на три категории:
Для реализации MFA необходимо выбрать, какие факторы будут использоваться. Например:
Для реализации MFA можно использовать готовые библиотеки или сервисы, такие как:
Рассмотрим пример реализации MFA с использованием Spring Security и TOTP (Time-Based One-Time Password).
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login", "/register").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/mfa-verify") // Перенаправление на страницу проверки MFA
.failureUrl("/login?error=true")
.and()
.logout()
.logoutSuccessUrl("/login")
.permitAll();
}
}
Для генерации TOTP можно использовать библиотеку Google Authenticator или OTPJava.
import com.eatthepath.otp.TimeBasedOneTimePasswordGenerator;
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.time.Instant;
public class MfaService {
private final TimeBasedOneTimePasswordGenerator totpGenerator;
public MfaService() throws Exception {
this.totpGenerator = new TimeBasedOneTimePasswordGenerator();
}
// Генерация секретного ключа для пользователя
public Key generateSecretKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(totpGenerator.getAlgorithm());
keyGenerator.init(160); // 160 бит для SHA-1
return keyGenerator.generateKey();
}
// Генерация TOTP
public int generateTotp(Key secretKey) throws Exception {
return totpGenerator.generateOneTimePassword(secretKey, Instant.now());
}
// Проверка TOTP
public boolean verifyTotp(Key secretKey, int userCode) throws Exception {
int serverCode = generateTotp(secretKey);
return serverCode == userCode;
}
}
@Controller
public class MfaController {
@Autowired
private MfaService mfaService;
@GetMapping("/mfa-verify")
public String showMfaVerificationPage() {
return "mfa-verify"; // Страница для ввода TOTP
}
@PostMapping("/mfa-verify")
public String verifyMfaCode(@RequestParam("code") int code, HttpSession session) {
Key secretKey = (Key) session.getAttribute("secretKey");
try {
if (mfaService.verifyTotp(secretKey, code)) {
return "redirect:/home"; // Успешная аутентификация
} else {
return "redirect:/mfa-verify?error=true"; // Ошибка проверки
}
} catch (Exception e) {
return "redirect:/mfa-verify?error=true";
}
}
}
Реализация многофакторной аутентификации (MFA) требует тщательного планирования и выбора подходящих факторов аутентификации. Использование библиотек, таких как Spring Security и TOTP-генераторы, значительно упрощает процесс. MFA повышает безопасность системы, добавляя дополнительные уровни проверки, что делает взлом учетных записей значительно более сложным.