[보안][HA]PBKDF2, BCrypt, Scrypt(비밀번호 암호화)

·2024년 4월 25일

보안

목록 보기
3/8

✔️ PBKDF2

pbkdf2_hmac(해시함수(sha256..), password, salt, iteration, DLen)

  • 해시함수의 컨테이너 역할을 한다.
  • 검증된 해시함수만을 사용한다.
  • 해시함수와 salt를 적용 후 해시 함수의 반복횟수를 지정하여 암호화할 수 있다.
  • 입력된 비밀번호 또는 패스프레이즈에 솔트 (암호학) 값과 함께 HMAC(해시 기반 메시지 인증 코드)와 같은 의사 난수 기능을 적용하고 이 과정을 여러 번 반복하여 유도 키를 생성한 후 후속 작업에서 암호화 키로 사용할 수 있다.
  • 비밀번호에 솔트를 추가하면 공격에 미리 계산된 해시(레인보 테이블)를 사용하는 능력이 줄어든다.
  • 여러 비밀번호를 한꺼번에 테스트하는 것이 아니라 개별적으로 테스트해야 한다.
  • 공개 키 암호화 표준에서는 최소 64비트의 솔트 길이를 권장한다.
  • 미국 국립표준기술연구소에서는 최소 128비트의 솔트 길이를 권장한다.
  • 가장 많이 사용되는 함수. ISO 표준에 적합하며 NIST에서 승인된 알고리즘이다.

✔️ BCrypt

bcrypt.hashpw(password, bcrypt.gensalt())

  • 1999년에 publish된 password-hashing function이다.
  • Blowfish 암호를 기반으로 설계된 암호화 함수이며 현재까지 사용중인 가장 강력한 해시 메커니즘 중 하나이다.
  • 보안에 집착하기로 유명한 OpenBSD에서 사용하고 있다.
  • BCrypt는 패스워드를 해싱할 때 내부적으로 랜덤 한 salt를 생성하기 때문에 같은 문자열에 대해서 매번 다른 해싱 결과를 반환한다.
  • 해싱 결과로 반환되는 String의 길이는 매번 60으로 동일하다.
  • salt가 통합된 형식으로 인해 레인보 테이블(rainbow table) 공격을 방지할 수 있다.
  • 반복 횟수를 늘려서 연산 속도를 늦출 수 있기 때문에 연산 능력이 증가하더라도 브루트 포스(brute force) 검색 공격에 대비할 수 있다.

✔️ SCrypt

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

  • 2009년에 publish된 key derivation function이다.
  • 오프라인 brute forece 공격에 대해 더 강력하지만, 많은 메모리와 CPU를 사용한다.
  • OpenSSL 1.1 이상을 제공하는 시스템에서만 작동한다.
  • 여러 언어의 라이브러리로 제공된다.
  • 다른 암호기반 KDF에 비해 많은 양의 메모리를 사용하도록 설계되었다.
  • 하드웨어 구현을 하는데 크기와 비용이 훨씬 더 비싸기 때문에, 주어진 자원에서 공격자가 사용할 수 있는 병렬처리의 양이 한정적이다.

✔️ Why not SHA-Fmaily?

SHA가 보안에 결함이 있어서 안전하지 않기 때문이 아니라,SHA는 일반적으로 GPU연산에 유리한 32비트 논리 및 산술 연산만 사용하기 때문에, 공격자가 빠른연산으로 공격할 수 있기 때문이라는 것이다.그로인해 Bcrypt 설계자들은 이런 문제로 SHA가 아닌 Blowfish를 이용하여 구현하였다.

  • 이상적으로 봤을때 limit가 없는 연산 능력을 가진 공격자는 모든 종류의 암호화 알고리즘을 해독 할 수 있겠지만, 이는 어디까지나 이론적인 상황이지 실제로 공격자는 컴퓨터자원을 무제한으로 보유하지 않기 때문에, 공격자의 속도를 늦출 수록 암호화 해독이 어려워진다.
  • 어떤 암호화 함수(bcrypt, pbkdf2, scrypt, ..)를 쓰던 강력하지만, 충분한 시도 횟수, work-factor가 존재한다고 가정할 때, 방어자는 좀 더 느리게 설계된 암호화 방식에 의존하는 것이 낫다고 생각된다.

✔️ Then what?

  • ISO-27001 보안 규정을 준수해야하는 상황이면 PBKDF2를 사용하자.
  • 일반적으로 규정을 준수해야할 상황이 아니면 구현이 쉽고 비교적 강력한 BCrypt를 사용하자.
  • 보안 시스템을 구현하는데 많은 비용을 투자할 수 있다면, Scrpyt를 사용하자.

참고글 1 https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-bcrypt-%EB%AA%A8%EB%93%88-%EC%9B%90%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%B2%95#bcrypt
참고글 2 https://wildeveloperetrain.tistory.com/175
참고글 3 https://ko.wikipedia.org/wiki/PBKDF2

profile
백엔드 개발자가 되고 싶어요(22.8.15~)

0개의 댓글