728x90

DelegatingPasswordEncoder의 장점

DelegatingPasswordEncoder는 비밀번호를 암호화 할 때 사용했던

PasswordEncoder 구현 객체를 생성해주는 컴포넌트다.

 

사용할 암호화 알고리즘을 지정하지 않으면 스프링 시큐리티가 권장하는

최신 암호화 알고리즘을 적용하여 패스워드를 암호화 해준다.

 

암호화 방식을 변경할 일이 생겨도 언제든 암호화 방식을 바꿀 수 있다.

(기존 암호화 된 패스워드에 대한 마이그레이션 필요)

 

커스텀 DelegatingPasswordEncoder 생성

PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();

기존에는PasswordEncoderFactories의 createDelegatingPasswordEncoder 메서드를 사용하여

DelegatingPasswordEncoder 객체를 생성하여 다시 적절한 PasswordEncoder 객체를 생성했다.

String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());

PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);

하지만 위와 같이 DelegatingPasswordEncoder의 생성자로 키값과 맵 객체를 넘겨주면

해당 맵 객체에서 키에 해당하는 암호화 알고리즘을 적용할 수 있다.

 

스프링 시큐리티의 암호화 형식

데이터베이스에서 암호화 된 패스워드를 살펴보면

{암호화알고리즘}암호화된패스워드
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG

위와 같은 PasswordEncoder의 ID와 encodedPassword

형식으로 저장된 것을 볼 수 있다.

 

암호화 알고리즘

Plain Text

암호화하지 않은 텍스트 그 자체

반드시 암호화 하는 것이 좋다.

 

Hash

단방향 암호화

패스워드 같은 경우는 다시 복호화 할 필요가 없기 때문에

해시 알고리즘을 사용하는 것도 괜찮다.

 

MD5

단방향 암호화

MD2, MD4 해시 알고리즘의 결함을 보완한 알고리즘

 

다이제스트: 원본 메시지를 암호화한 메시지

 

SHA

MD5의 결함을 보완한 해시 알고리즘

해시된 문자열의 비트 값을 회전하면서 해시 처리를 함

 

Salt

알고리즘보다는 대응책에 가깝다.

원본 메시지에 임의의 문자열을 추가하여 해시 처리 함

 

PBKDF2, bcrypt, scrypt

솔트와 키 스트레칭, 메모리 오버헤드 등에

복잡한 알고리즘까지 더하여

복호화를 어렵게 하는 해시 알고리즘

+ Recent posts