암호화

kwang·2023년 5월 6일
0

PasswordEncoder

해당 인터페이스는 스프링 시큐리티에서 사용자 암호를 검증하는 방법을 구현한다. 아래와 같은 구성을 가진다.

public interface PasswordEncoder {

	String encode(CharSequence rawPassword);

	boolean matches(CharSequence rawPassword, String encodedPassword);

	default boolean upgradeEncoding(String encodedPassword) {
		return false;
	}
}

구현체 종류

  • NoOpPasswordEncoder
    암호를 인코딩하지 않고 일반 텍스트로 유지 실제로 암호하지 않기 때문에 서비스에서 사용은 절대 금지!
  • StandardPasswordEncoder
    SHA-256을 이용해 암호를 해시한다 옛날 방식이며 강도가 약한 해싱 알고리즘을 사용하기에 새로운 프로젝트를 진행한다면 사용하지 말 것
  • Pbkdf2PasswordEncoder
    PBKDF2를 이용한다. 키의값, 반복 횟수, 해시를 입력하는 방식으로 반복 횟수와 해시의 크기에 따라 강도는 결정되지만 강해질수록 성능 문제가 생길 수 있다.
  • BCryptPasswordEncoder
    bcrypt 강력 해싱 함수로 암호를 인코딩한다.
  • SCryptPasswordEncoder
    scrypt 해싱 함수로 암호를 인코딩한다.

DelegatingPasswordEncoder

애플리케이션에서 암호화를 새로운 방식으로 전환하고 싶을때가 있을 수 있다. 이럴때 기존 암호화된 정보들을 새로운 암호화 방식으로 바꾸는 게 쉽지 않을 수 있다. 이러한 경우 해당 객체를 이용하는것은 좋은 방법이 될 수 있다.

DelegatingPasswordEncoder는 PasswordEncoder에 구현체중 하나이지만 실제로 암호화를 구현하지 않고 다른 구현체에게 작업을 위임한다.

내부적으로 map을 가지고 있으며 다른 구현체들을 해당 맵에 접두사를 키로 구현체를 값으로 가지고 있다.
예를 들어 BCryptPasswordEncoder이면 키로 bcrypt를 값으로 BCryptPasswordEncoder를 가지고 있는것이다.

0개의 댓글