비밀번호 암호화(Bcrypt)

kys95·2022년 9월 16일
0

비밀번호 암호화

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

  • 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개의 댓글