모든 아티클

Argon2: 이 알고리즘이 비밀번호 해싱 경진대회에서 우승한 이유

한국인터넷진흥원(KISA)의 개인정보 안전성 확보조치 기준은 비밀번호를 "일방향 암호화"하여 저장하도록 요구하며, 실무에서는 이를 충족하는 현대적인 해시 함수 사용을 권장한다. 2015년 Password Hashing Competition에서 우승한 이후 OWASP가 bcrypt보다 우선 권장하는 Argon2는 네이버, 카카오 같은 대형 플랫폼뿐 아니라 스타트업 백엔드에서도 PHP의 password_hash()나 Laravel의 Hash 파사드를 통해 손쉽게 도입할 수 있는 표준으로 자리 잡았다.

왜 시간만큼 메모리가 중요한가

Bcrypt와 PBKDF2는 계산 시간만 늦춥니다. Argon2는 여기에 더해 매 시도마다 설정 가능한 양의 RAM을 확보하도록 강제합니다 — 이를 memory-hard 함수라고 부릅니다. 클라우드에서 빌린 GPU 팜은 단순 계산을 저렴하게 병렬화할 수 있지만, 대량의 메모리에 동시에 접근하는 것을 병렬화하는 것은 훨씬 더 비쌉니다. 메모리는 연산 코어와 달리 카드당 물리적으로 제한되어 있기 때문입니다.

세 가지 변형: d, i, id

  • Argon2d — 메모리 접근이 비밀번호 자체에 의존하여 GPU에 대한 최대 저항력을 제공하지만, 이론적으로 사이드 채널 공격에 노출될 수 있습니다.
  • Argon2i — 메모리 접근이 비밀번호와 무관하여 그 허점을 막지만, GPU 저항력은 약간 낮습니다.
  • Argon2id — 계산의 서로 다른 단계에서 두 전략을 결합합니다. RFC 9106이 권장하는 변형이며, 대부분의 프레임워크에서 기본값입니다.

세 가지 독립적인 매개변수

bcrypt의 단일 "cost factor"와 달리, Argon2는 메모리, 반복 횟수, 병렬성을 각각 독립적으로 조정할 수 있습니다. 이는 실무에서 유용합니다: 메모리가 제한된 서버리스 함수는 반복 횟수를 늘려 보완할 수 있고, RAM이 넉넉한 전용 인증 서버는 그 반대로 할 수 있습니다.

왜 필요한가

  • MD5나 단순 SHA-256 대신 새 인증 시스템을 위한 현대적인 알고리즘 선택하기.
  • Argon2가 대여한 GPU나 암호화폐 채굴용 하드웨어를 이용한 공격을 왜 특히 비싸게 만드는지 이해하기.
  • 보안 감사의 일환으로 bcrypt나 PBKDF2에서의 마이그레이션 계획하기.

병렬성의 함정

병렬성은 공짜 이득처럼 보입니다 — 스레드가 많을수록 다중 코어 서버에서 해싱이 빨라지니까요. 하지만 동일한 다중 코어 하드웨어를 가진 공격자도 매 시도마다 똑같은 속도 향상을 얻습니다. 병렬성을 서버의 실제 코어 수에 맞추는 것은 안전하지만, "여유를 위해" 더 높이는 것은 공격자에게 비례한 할인만 제공할 뿐입니다.

도구 사용해보기