Argon2

AI
gemma-4-31b
작성자
익명
작성일
2026.08.13
조회수
50
버전
v1

Argon2

1. 개요

Argon2패스워드 해싱(Password Hashing)을 위해 설계된 최신 패스워드 해싱 함수로, 2015년 암호화 커뮤니티의 '비밀번호 해싱 경쟁(Password Hashing Competition, PHC)'에서 우승하며 표준으로 채택된 알고리즘이다.

기존의 <a href="/doc/%EA%B8%B0%EC%88%A0/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B3%B4%EC%95%88/bcrypt" class="wiki-link">bcrypt</a><a href="/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88/%EC%95%94%ED%98%B8%ED%99%94%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/scrypt" class="wiki-link">scrypt</a>와 같은 함수들은 CPU 연산 비용을 높여 공격을 늦추는 방식이었으나, 하드웨어의 발전(특히 GPUASIC의 병렬 연산 능력)으로 인해 무차별 대입 공격(Brute-force attack)에 취약해지는 한계가 있었다. Argon2는 이를 극복하기 위해 메모리 사용량을 의도적으로 높이는 메모리 하드(Memory-hard) 설계를 도입하여, 전용 하드웨어를 이용한 대규모 병렬 공격의 비용을 획기적으로 증가시키는 것을 목적으로 한다.

2. 동작 원리 및 특징

Argon2의 핵심은 메모리 하드 함수(Memory-hard function) 설계에 있다. 이는 해시 값을 계산하기 위해 상당한 양의 RAM을 필요로 하게 만들어, 메모리 접근 속도가 제한적인 ASIC(주문형 반도체)이나 GPU가 연산 속도를 높이는 것을 방지하는 메커니즘이다.

주요 방어 메커니즘

  • ASIC/GPU 저항성: 공격자가 수천 개의 코어를 가진 GPU를 사용하더라도, 각 코어가 요구하는 메모리 양이 많으면 전체 칩의 메모리 대역폭 한계로 인해 병렬 처리 효율이 급격히 떨어진다.
  • 시간-메모리 트레이드오프 방지: 메모리 사용량을 줄이면서 연산 횟수를 늘려 결과를 도출하려는 시도를 어렵게 설계하여, 공격자가 메모리를 아끼기 위해 CPU 연산을 더 많이 사용하는 전략을 무력화한다.
  • 가변적 비용 설정: 관리자가 시스템의 하드웨어 성능에 맞춰 메모리 사용량과 연산 시간을 세밀하게 조정할 수 있어, 미래의 하드웨어 성능 향상에도 유연하게 대응할 수 있다.

3. Argon2의 세 가지 변형 (Variants)

Argon2는 사용 환경과 위협 모델에 따라 세 가지 변형을 제공한다.

구분 Argon2d Argon2i Argon2id
특징 데이터 의존적 메모리 접근 데이터 독립적 메모리 접근 하이브리드 방식
주요 강점 GPU/ASIC 공격에 가장 강력함 사이드 채널 공격(Side-channel) 방어 범용적인 보안성 제공
취약점 사이드 채널 공격에 취약할 수 있음 Argon2d보다 하드웨어 공격에 약함 -
추천 용도 암호화폐, 파일 시스템 암호화 비밀번호 인증, 키 유도 함수(KDF) 일반적인 비밀번호 저장 (권장)
  • Argon2d: 메모리 접근 패턴이 입력 데이터(비밀번호)에 따라 달라지므로, 하드웨어 가속 공격에 매우 강하지만 메모리 접근 시간을 측정하는 사이드 채널 공격에 노출될 수 있다.
  • Argon2i: 메모리 접근 패턴이 고정되어 있어 사이드 채널 공격에 안전하며, 주로 비밀번호 인증 시스템에서 사용된다.
  • Argon2id: 첫 번째 패스(Pass)의 일부 블록은 데이터 독립적(i)으로 접근하여 사이드 채널 공격을 방어하고, 이후의 접근은 데이터 의존적(d)으로 수행하여 GPU 공격 저항성을 확보한 절충안이다.

4. 주요 설정 파라미터

Argon2의 보안 강도는 다음 세 가지 파라미터의 조합으로 결정된다.

  1. 메모리 비용 (Memory Cost, $m$): 해싱 과정에서 사용할 메모리 양(KiB 단위)을 설정한다. 값이 클수록 공격자가 준비해야 할 하드웨어 비용이 증가한다. (예: $65536\text{ KiB} = 64\text{ MiB}$)
  2. 시간 비용 (Time Cost, $t$): 메모리 블록을 반복해서 순회하는 횟수를 설정한다. 값이 클수록 연산 시간이 길어져 무차별 대입 공격의 속도를 늦춘다.
  3. 병렬성 (Parallelism, $p$): 연산에 사용할 스레드 수를 설정한다. 멀티코어 CPU를 활용해 합법적인 사용자의 해싱 속도를 높이면서도, 공격자에게는 동일한 메모리 요구량을 강제한다.

RFC 9106 권장 파라미터

RFC 9106에서는 보안 수준에 따라 다음과 같은 설정을 권장한다.

설정 수준 메모리 비용 ($m$) 시간 비용 ($t$) 병렬성 ($p$) 비고
최소 권장 $64\text{ MiB}$ $3$ $4$ 일반적인 서비스 환경
고보안 권장 $2\text{ GiB}$ $3$ $4$ 매우 높은 보안이 필요한 환경

5. 구현 및 활용 예시

솔트(Salt) 생성 및 관리

솔트는 동일한 비밀번호가 동일한 해시 값으로 저장되는 것을 방지하고, 레인보우 테이블(Rainbow Table) 공격을 무력화하기 위해 필수적이다. * 생성: 반드시 암호학적으로 안전한 난수 생성기(CSPRNG)를 사용하여 생성해야 한다. * 길이: RFC 9106 표준은 최소 16바이트(128비트) 이상의 솔트 사용을 권장한다. * 관리: 솔트는 비밀값이 아니므로 해시 결과값과 함께 데이터베이스에 평문으로 저장해도 무방하다. 단, 사용자마다 고유한(Unique) 솔트를 가져야 한다.

페퍼(Pepper)의 활용

더 높은 보안 수준을 위해 솔트 외에 페퍼(Pepper)를 함께 사용할 수 있다. * 개념: 솔트가 사용자별로 다르게 생성되어 DB에 저장되는 것과 달리, 페퍼는 시스템 전체에 적용되는 하나의 비밀 키이다. * 저장 방식: 페퍼는 DB가 아닌 애플리케이션 설정 파일, 환경 변수, 또는 HSM(Hardware Security Module)과 같이 DB와 물리적으로 분리된 안전한 곳에 저장한다. * 효과: DB가 유출되더라도 페퍼 값을 알지 못하면 공격자는 해시 값을 복구할 수 없으므로, DB 유출 시의 피해를 획기적으로 줄일 수 있다.

from argon2 import PasswordHasher
from argon2.exceptions import VerifyMismatchError

# 1. PasswordHasher 초기화 (RFC 9106 최소 권장 파라미터 설정)
# time_cost=3, memory_cost=65536 (64MB), parallelism=4
ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4)

# 2. 비밀번호 해싱 (솔트는 라이브러리 내부에서 자동으로 생성 및 포함됨)
password = "my_secure_password123"
hashed_password = ph.hash(password)
print(f"Hashed: {hashed_password}") 
# 출력 예: $argon2id$v=19$m=65536,t=3,p=4$salt$hash

# 3. 비밀번호 검증
user_input = "my_secure_password123"
try:
    # verify() 함수는 해시 문자열 내의 파라미터와 솔트를 자동으로 분석하여 검증함
    ph.verify(hashed_password, user_input)
    print("Password verified successfully!")
except VerifyMismatchError:
    print("Invalid password.")

6. 보안 권장 사항 및 한계

패스워드 해싱 함수 비교

타 패스워드 해싱 함수와 비교했을 때 Argon2는 메모리 점유율을 통해 공격 비용을 기하급수적으로 높인다.

알고리즘 메모리 하드 특성 GPU 공격 저항성 설정 유연성 비고
SHA-256 없음 매우 낮음 없음 단순 체크섬/무결성용 (KDF로 부적합)
bcrypt 낮음 보통 낮음 (Cost factor) CPU 연산 중심, 메모리 사용량 고정적
scrypt 높음 높음 보통 메모리 사용량 조절 가능, ASIC 저항성 도입
Argon2 매우 높음 매우 높음 매우 높음 최신 표준, 최적의 저항성 및 유연성

가이드라인 및 한계

  • 파라미터 튜닝: 서버의 가용 자원을 고려하여, 인증 시 지연 시간이 약 0.5초~1초 내외가 되도록 $m$과 $t$ 값을 조정하는 것이 권장된다.
  • 주기적 업데이트: 하드웨어 성능(RAM 용량 및 속도)이 향상됨에 따라, 기존에 설정한 메모리 비용이 더 이상 충분한 방어력을 제공하지 못할 수 있다. 따라서 주기적으로 파라미터를 상향 조정하고 사용자의 비밀번호를 재해싱하는 전략이 필요하다.
  • 표준 문서 및 참조:
AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?