데이터베이스에 비밀번호 저장 시, 개인정보 보호법에 따라 반드시 SHA2-256 해쉬 암호화된 결과로 저장해야 합니다.
암호화 알고리즘을 사용하기 위해 Spring-Security Sub-Project가 제공하는 의존성을 추가해야 합니다.
비밀번호의 암호화 저장도 중요한만큼, 입력된 평문암호와 DB에 저장되어 있는 해쉬 알고리즘의 비교를 통해 암호 일치여부를 검증하는 방법도 알아야 합니다.
해쉬 알고리즘은 원본 데이터를 불가역적인 변환을 통해 암호화된 결과(Hash)를 얻습니다.
즉, 해쉬 알고리즘은 복원이 불가능한 단뱡향 암호화 알고리즘 중 하나라고 할 수 있습니다.
가장 많이 사용하는 비밀번호 암호화 알고리즘은 'BCrypt'라는 알고리즘이며 스프링 시큐리티는 BCryptPasswordEncoder 클래스를 제공합니다.
평문 암호(Plain Text)와 해쉬 암호(Cipher Text)를 콘솔에 로그로 출력하였습니다.
@Log4j2
@NoArgsConstructor
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class PasswordEncoderTests {
// @Disabled
@Tag("fast")
@Test
@Order(1)
@DisplayName("testBCryptPasswordEncoder")
@Timeout(1L)
void testBCryptPasswordEncoder() {
log.trace("testBCryptPasswordEncoder() invoked.");
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
log.info("\t encoder({}) invoked.", encoder);
String plainText = "0123456789";
String cipherText = encoder.encode(plainText);
log.info("\t cipherContext: {}", cipherText);
} // testPasswordEncoder
} // end class
평문 암호와 해쉬 암호를 assertj를 활용하여 비교합니다.
@Log4j2
@NoArgsConstructor
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class PasswordEncoderTests {
@Tag("fast")
@Test
@Order(1)
@DisplayName("testBCryptPasswordEncoder")
@Timeout(1L)
void testBCryptPasswordMatches() {
log.trace("testBCryptPasswordMatches() invoked.");
String plainText = "0123456789";
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
// BCryptPasswordEncoder encoder2 = new BCryptPasswordEncoder();
String cipherText = encoder.encode(plainText);
boolean isMatched = encoder.matches(plainText, cipherText);
assertThat(isMatched).isEqualTo(true);
log.info("\t isMatched: {}", isMatched);
} // testBCryptPasswordMatches
} // end class
BCrypt는 동일한 평문 암호를 입력하더라도 매번 다른 해시 암호를 도출합니다.
'Java > Design Patterns' 카테고리의 다른 글
프록시 패턴 (0) | 2023.08.13 |
---|---|
어댑터 패턴 (0) | 2023.08.13 |