비밀번호 암호화(Bcrypt)

kys95·2022년 9월 16일

비밀번호 암호화

비밀번호는 개인의 정보와 밀접한 관련이 있기 때문에 노출되지 않도록 엄격한 주의가 필요하다. (대부분의 유저가 아이디와 비밀번호를 같게 쓰는 경우가 많아 한곳에서 노출되면 여러 곳에서 노출되는 것과 같다) 이 밖에 비밀번호 암호화가 필요한 이유에 대해 정리해보면 다음과 같다.

  • DB가 해킹당하면 유저의 비밀번호가 그대로 노출
  • 외부 해킹이 아니더라도 내부인력에게 노출 될 수 있음, 암호화를 통해 내부인력에게도 숨김

비밀번호 암호화 방법

  1. 단방향 해쉬함수(one-way hash function) : 한번 암호화 된 정보는 되돌릴 수 없다. ex) MD5, SHA

    • 그럼 어떻게 암호화 된 비밀번호를 맞는 지 확인할까?
      • 암호화 된 비밀번호를 저장, 로그인시 입력받은 비밀번호를 암호화 하여 동일한지 확인하여 로그인
    • 단방향 해쉬함수의 용도는 본래 비밀번호 암호화가 아니기 때문(본래는 짧은 시간에 데이터를 검색하기 위해 설계) 보안의 취약점이 있다.
    • 단점 : 입력값에 대한 결과값이 정해져 있기 때문에 역추적(Rainbow table attack)이 가능하다.
  2. Bcrypt : 비밀번호를 위해 만들어진, 단방향 해쉬함수의 취약점을 보안한 암호화 방법

    • Salting : 실제 비밀번호 이외 소금치듯 랜덤데이터를 추가하여 해시값을 계산한다.
      • 위 방법은 암호의 길이를 길게해 역추적의 경우의 수를 늘려 해쉬테이블을 만들지 못하도록 함
    • Key Stretching : 단방향 해쉬함수를 여러번 반복해서 해시값을 계산하는 방법
      • key stretching는 암호화 하는 속도를 늦춤. 로그인시 지연이 살짝쿵 발생
      • 컴퓨터의 성능이 향상되는 만큼 암호화 반복횟수를 늘려 암호화 보완이 가능

BCrypPasswordEncoder

BCryptPasswordEncoder는 Spring Security 프레임워크에서 제공하는 클래스로 비밀번호를 암호화(해시)하는 데에 사용한다.

BCryptPasswordEncoder에서 제공하는 메소드

  1. String encode(CharSequence rawPassword)
dto.setPassword(passwordEncoder.encode(dto.getPassword()));

사용자로 부터 입력받은 password를 인코딩한다. 해시시킬 때 무작위로 생성한 salt가 포함되므로 같은 비밀번호를 인코딩해도 매번 다른 결과값이 반환된다.

  1. boolean matches(CharSequence rawPassword, String encodedPassword)
if(!passwordEncoder.matches(req.getPassword(),account.getPassword())){
            throw new CustomException(CustomExceptionStatus.FAILED_TO_LOGIN);
        }

제출된 인코딩 되지 않은 암호와 저장소에 있는 인코딩된 암호가 일치하는지 확인한다. 비밀번호가 일치하면 true를 반환하고 일치하지 않으면 false를 반환한다.

profile
어제의 나보다 나은 사람이 되자

0개의 댓글