본문 바로가기
책을 읽겠습니다!/Spring Security in Action

[Spring Security in Action] 암호처리

by Unagi_zoso 2023. 9. 27.
public interface PasswordEncoder {
    String encode(CharSequence rawPassword);
    boolean matches(CharSequence rawPassword, String encodedpassword);

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

인코드는 문자열을 변환해 반환, 매치를 통해 일치 여부를 알 수 있다. 메치 메서드는 지정된 암호를 인증 프로세스에서 알려진 자격 증명의 잡합을 대상으로 비교한다.
업그레이드인코딩을 트루로 하면 인코딩된 암호를 보안 향상을 위해 다시 인코딩.

NoOpPasswordEncoder는 암호를 일반 텍스트 취급

PasswordEncoder는 SHA-512 해싱 알고리즘을 사용한다. 매치 시에는 해시해서 저장된 비밀번호와 자신이 입력한 비밀번호를 해시하여 일치여부를 따진다.


PasswordEncoder의 제공된 구현 선택

  • NoOpPasswordEncoder - 인코딩 없이 실제 상황에선 절대 쓰지마
  • StandardPasswordEncoder - SHA-256을 이용해 암호를 해시한다. 구식이다. 강도가 약한 해싱 알고리즘 사용 키 크기가 작긴 하네
  • Pbkdf2PasswordEncoder - PBKDF2를 이용한다 HMAC 사용 단순하고 느릲 해싱 인코딩 횟수, 해시 크기 등 결정한다.
  • BCryptPasswordEncoder - bcrypt 강력 해싱 함수로 암호를 인코딩한다.
  • SCryptPasswordEncoder - scrypt 해싱 함수로 암호 인코딩

bcrypt 좋아. 강력해. 로그 라운드 지정할 수 있고, SecureRandom 인스턴스를 바꿀 수도 있다. 로그라운드는 4~31이여야한다.

SCryptPasswordEncoder는 scrypt 해싱 함수를 이용한다. 다양하게 매개변수에 넣을 수 있다.

DelegatingPasswordEncoder 이용한 여러 인코딩 전략

암호 일치 위해 다양한 구현 적용할 때 사용. PasswordEncoder 이너페이스를 구현하는 다른 객체에 위임.

일반적 시나리오. 특정 앱 버전부터 인코딩 알고리즘이 변경될 때. 기존 자격 증명을 변경하기 쉽지않을 때 여러 종류 해시 지원해야하는데. 이러기 위해서 좋다.

DelegatingPasswordEncoder는 PasswordEncoder 인터페이스의 한 구현이며 자체 알고리즘을 구현하는 대신 같은 계약의 다른 구현 인스턴스에 작업을 위임한다.
Dele에 맵을 가지고 키와 인스턴스를 저장한다. 클라이언트에서 요청할 때 키도 같이 보내서 이걸로 밸류를 찾는다.

configClass {

@Bean
public PasswordEncoder passwordEncoder() {
    Map<String, PasswordEncdoer> encoders = new HashMap<>();

    encoders.put("noop", NoOp.getIns());
    ..
    ..

    return new DelegatingPasswordEncoder("bcrypt", encoders);
}
  • 이니코딩. 입력에 대한 모든 변환
  • 암호화 출력을 얻기 위해 입력값, 키 모두 지정하는 특정유형의 인코딩

대칭키와 비대칭키 있다.

대칭키 쓰면 하나의 키 돌려 써서 암호화 복호화
비대칭키 쓰면 서로 개인키 공개키 들고 XOR 해서 결과 받는다.

해싱은 함수가 한 방향으로 작동.출력에 y에서 입력 x 얻을 수 없다. 그러나 출력 y가 입력 x에 해당하나ㅡㄴ지 확인할 수 이써야한다. 알지?

떄때로 해싱함수는 입력에 임의의 값을 추가할 수도 있다. (x, k) -> y 이 값을 솔트라 한다. 함수를 더 강하게 만들어 결과에서 입력을 얻는 역함수의 적용 난도를 높인다. 양자컴으로 깨질 수 있다네.


UserDetails : 스프링 시큐리티가 관리하는 사용자를 나타낸다.
GrantedAuthority : 애플리케이션의 목적 내에서 사용자에게 허용되는 작업을 정의한다.
UserDetailsService : 사용자 이름으로 사용자 세부 정보를 검색하는 객체를 나타낸다.
UserDetailsmanager : UserDetailsService의 더 구체적인 계약이다. 사용자 이름으로 사용자 검색 뿐만 아니라 사용자 컬렉션이나 특정 사용자 변경도 가능
PasswordEncoder : 암호를 암호화 또는 해시하는 방법과 비교하는 방법 지정


암호화 및 복호화 함수와 키 생성 기능은 자바에 없어. 시큐리티가 제공해준다.

  • 키 생성기 - 해싱 및 암호화 알고리즘을 위한 키를 생성하는 객체
  • 암호기 - 데이ㅓ를 암ㅎ화 및 복호화하는 객체

StringKeyGenerator, Encryptor 같은거 있다. 필요하면 공부해보자. 뭔가 고급과정같다.

요약

  • PasswordEncoder는 인증 논리에서 암호를 처리하는 가장 중요한 책임을 담당한다.
  • 스프링 시큐리티는 해싱 알고리즘에 여러 대안을 제공하므로 필요한 구현을 선택하기만 하면 된다.
  • 스프링 시큘티 암호화 모듈에는 키 생성기, 암호기 구현 여러 대안 있다.
  • 키 생성기는 암호화 알고리즘에 이용되는 키를 생성하도록 도와주는 유틸리티 객체다.
  • 암호기는 데이터 암호화와 복호화를 수행하도록 하는 유틸리티 객체다.

댓글