Encryptors
클래스는 대칭 암호화기를 생성하기 위한 팩터리 메서드를 제공합니다. 이 클래스를 사용하면 BytesEncryptor
인스턴스를 만들어 원시 형식의 데이터를 암호화 할 수 있습니다.
팩토리 메소드를 사용해서 생성할 수 있습니다.
Encryptors.stronger("password", "salt");
암호화 방법은 256비트 AES 암호화를 사용하여 암호화기를 만듭니다. 솔트는 암호화된 데이터가 손상된 경우 키에 대한 사전 공격을 방지하는 데 사용됩니다.
제공된 salt는 16진수로 인코딩된 문자열 형식이어야 하며 임의적이어야 하며 길이가 8바이트 이상이어야 합니다.
String salt = KeyGenerators.string().generateKey();
// generates a random 8-byte salt that is then hex-encoded
팩토리 메소드를 사용해 표준 TextEncryptor를 생성할 수 있습니다.
Encryptors.text("password", "salt");
spring-security-crypto PasswordEncoder
는 중앙 서비스 인터페이스이며 다음과 같은 서명이 있습니다.
public interface PasswordEncoder {
String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
matches
메서드는 rawPassword
가 인코딩되면 true를 반환합니다.
BCryptPassword 인코더
이 구현은 널리 지원되는 bcrypt
알고리즘을 사용하여 암호를 해시합니다. bcrypt
는 임의의 16바이트 솔트 값을 사용하며 암호 크래커를 방해하기 위해 의도적으로 느린 알고리즘입니다.
// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
Pdkdf2PasswordEncoder 인코더
PBKDF2 알고리즘을 사용하여 암호를 해시합니다. 암호 크래킹을 무력화하기 위해 의도적으로 느린 알고리즘이며 시스템에서 암호를 확인하는 데 약 .5초가 걸리도록 조정해야 합니다.
// Create an encoder with all the defaults
Pbkdf2PasswordEncoder encoder = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
Spring Security는 사용자 인증(로그인)시 비밀번호에 대해 단뱡향 해시 암호화
를 진행하며 저장되어 있는 비밀번호와 대조한다. 따라서 회원가입 시 비밀번호 항목에 대해서 암호화를 진행해야한다.
스프링 시큐리티는 암호화를 위해 BCrypt
Password Encoder를 제공하고 권장한다. 따라서 해당 클래스를 return하는 메소드를 만들어 @Bean으로 등록하여 사용하면 된다.
public confing {
...
@Bean
public BcryptPasswordEncoder bcryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}