[Security] Bcrypt

Bik_Kyun·2022년 4월 8일
0
post-thumbnail

1. Bcrypt

  • 암호를 단방향 암호화 해주는 해쉬함수.
  • Blowfish 암호를 기반으로 설계된 암호화 함수.
  • 현재까지 사용중인 가장 강력한 hash 메커니즘 중 하나.
  • 많은 플랫폼, 언어에서 사용할 수 있다.
  • key stretching 기능으로 연산 능력이 증가해도 brute-force 공격에 대비 가능.

작동 구조

  • hashing : hash함수를 사용하여 원본의 의미를 알 수 없게 하는 것.
  • salting : 실제 비밀번호에 랜덤 값을 더하는 것. 비밀번호에서 salt값을 더한 후 hashing을 실시한다.
  • key stretching : hashing을 여러번 반복 실행하는 것.

적용 예시

class SignUpView(View):
    def post(self, request):
        try:
            data          = json.loads(request.body)
            email         = data['email']
            password      = data['password']
            phone_number  = data['phone_number']

            validate_email(email)
            validate_password(password)
            validate_phone_number(phone_number)
            #####################
            hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
            #####################
            User.objects.create(
                first_name    = data['first_name'],
                last_name     = data['last_name'],
                email         = email,
                password      = hashed_password,
                phone_number  = phone_number,
                date_of_birth = data["date_of_birth"]
            )

            return JsonResponse({'message' : 'CREATED'}, status = 201)
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)
        except IntegrityError:
            return JsonResponse({'message' : 'THIS_EMAIL_ALREADY_EXIST.'}, status = 400)
        except ValidationError as e:
            return JsonResponse({'message': e.message}, status = 400)

bcrypt.gensalt()로 salt값을 생성하고 password에 더한 다음 bcyrpt.hashpw()로 hashing을 실시하였다.

2. 왜 Bcrypt를 사용했는가?

SHA류의 암호화가 무조건 나쁜것도 아니고 bcrypt가 무조건 좋다 이것도 아니라고 생각한다.
ISMS-P, ISO-27001은 SHA-2, PBKDF2를 권고하고 KISA에서도 공식적으로 권고되는 방식은 아니다.
(KISA에서는 외부에 salt를 저장해서 읽어온 후 hash하는 방식을 권장한다.)

그럼에도 왜 bcrypt를 썼냐고 물어보면 소규모 팀 프로젝트이기도 하고 기능적인 구현을 위해 API 개발에 더 집중했기 때문에 salt를 따로 관리/저장하지 않아도 된다는 점, 암호화 적용이 편리하다는 점, 그럼에도 비교적 강력한 암호화 방식이라는 점에 끌려 선택하게 되었다.

3. 참고

  • SHA를 암호해싱에 사용하는 암호화 함수들은 GPU를 이용한 공격에 취약하며(SHA류는 연산속도가 매우 빠르기 때문) 많은 메모리를 필요로 하지 않는 점이 문제로 지적된다.
  • SHA가 보안에 결함이 있어 안전하지 않은 것이 아니라, SHA는 일반적으로 GPU연산에 유리한 32비트 논리 및 산술 연산만 사용하기 때문에, 공격자가 빠른 연산으로 공격할 수 있기 때문이다.
    => 대안으로 Blowfish 방식 이용

팁?

  • 기본 해시 함수인 SHA, MD5등을 이용하는 것은 빠른 처리속도로 인하여 보안에 취약하기 때문에 충분히 사용자의 password를 보호할 수 없다. key derivation function를 사용하여 암호화를 진행하자.
  • 해시를 강하게 하기 위해서는 무작위 salt와 함께 반복적인 해싱작업이 필요하다.
  • ISO-27001 보안 규정을 준수해야하는 상황이면 PBKDF2를 사용하자.
  • 일반적으로 규정을 준수해야할 상황이 아니면 구현이 쉽고 비교적 강력한 Bcrypt를 사용하자.
  • 보안 시스템을 구현하는데 많은 비용을 투자할 수 있다면, Scrpyt를 사용하자.
profile
비진

0개의 댓글