키 유도 함수

IT 위키
보안기사 (토론 | 기여)님의 2025년 10월 2일 (목) 02:02 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

키 유도 함수(Key Derivation Function, KDF)는 암호학에서 마스터 키, 암호 또는 비밀 값으로부터 필요한 형식의 암호 키(또는 키 재료)를 안전하게 유도해 내는 함수이다.

개념과 목적[편집 | 원본 편집]

KDF는 다음 목적을 달성하기 위해 설계된다:

  • 비밀 값(비밀번호, 마스터 키, 공유 비밀 등)으로부터 하나 이상의 암호 키를 생성
  • 출력 키의 길이를 조절하거나 포맷을 맞춤
  • 동일 입력이 주어졌을 때 항상 동일한 출력 (결정론성)
  • 역산(출력 → 입력 복원)이 사실상 불가능 (단방향성)
  • 입력의 비균등한 분포를 보완하여 출력이 통계적으로 강건하게 분포되도록 함

예를 들어, 디피-헬만 등에서 산출된 공유 비밀(shared secret)을 대칭 암호 키로 쓰기 적합한 형태로 변환할 때 KDF가 쓰인다.

KDF는 흔히 “키 스트레칭(key stretching)” 또는 “키 강화(key strengthening)” 기법과 결합되어 사용되는데, 이는 약한 입력(예: 사람이 기억하는 짧은 비밀번호)을 공격자가 쉽게 브루트포스하지 못하도록 연산 비용을 높이는 방법이다.

주요 요소 및 입력[편집 | 원본 편집]

KDF는 일반적으로 다음과 같은 입력을 받는다:

  • 비밀 입력(예: password, master key, shared secret)
  • 솔트(salt) — 동일 입력에 대해 항상 같은 결과가 나오지 않도록 하는 랜덤 값
  • 반복 횟수 또는 비용 파라미터 (iteration count, 메모리 비용 등)
  • (선택적) 부가 정보(info / context) — 파생된 키가 특정 용도나 컨텍스트에 묶이도록

이들 입력을 기반으로 의사난수 함수(Pseudo‑Random Function, PRF) 또는 해시 기반 구조 등을 반복하여 최종 유도된 키(derived key)를 생성한다. 또한, NIST에서도 KDF를 “공유된 비밀이나 키 등으로부터 키 재료(keying material)를 생성하는 함수”로 정의하고 있다.

대표적 KDF 알고리즘[편집 | 원본 편집]

다음은 널리 사용되는 주요 KDF 알고리즘들이다:

  • PBKDF2 (Password‑Based Key Derivation Function 2)
    • 입력 비밀번호 + 솔트 + 반복 횟수를 받아 HMAC 등을 반복 적용하여 유도 키를 생성한다.
    • 단점은 메모리 요구가 낮아서 병렬 하드웨어 공격에 취약할 수 있다는 점이다.
  • bcrypt
    • 원래는 비밀번호 해싱 함수지만 KDF 형태로도 볼 수 있다.
    • Blowfish 암호 설계 기반으로, 비용 파라미터(cost)를 조절하면 연산 부담을 조절할 수 있다.
  • scrypt
    • 메모리 비용도 함께 높이는 설계로 병렬화 공격을 어렵게 만든다.
  • Argon2
    • 암호 대회(Password Hashing Competition) 우승자로, 메모리와 병렬성 제어가 강화된 설계다.
  • HKDF (HMAC-based KDF)
    • “extract-then-expand” 구조를 가지며, HMAC을 기반으로 안전하게 여러 출력을 유도할 수 있다.

안전 고려 사항 및 설계 원칙[편집 | 원본 편집]

KDF를 설계하거나 사용할 때 고려해야 할 주요 사항은 다음과 같다:

  • 충분한 반복 또는 비용 설정
    • 반복 횟수(iteration)나 메모리/시간 비용을 높여 공격자가 많은 연산을 요구하도록 설계해야 한다.
  • 충분한 솔트 사용
    • 동일 비밀번호라도 서로 다른 솔트를 써서 동일 출력이 나오지 않도록 해야 한다. (레인보우 테이블 공격 방지)
  • context 바인딩 (info, label 등)
    • 동일 입력이더라도 서로 다른 목적(예: 암호화 키 / MAC 키 등)에 대해 다른 파생 키가 나오도록 보장할 수 있어야 한다.
  • 병렬화 및 하드웨어 공격 저항성
    • 단순한 반복 구조는 GPU/ASIC 기반 병렬 공격에 유리하므로, 메모리-하드(Memory-Hard) 구조 또는 제어 요소가 중요하다.
  • 출력 키 독립성
    • 서로 다른 목적의 키들이 서로 영향을 미치지 않도록 독립성을 유지해야 한다.

응용 및 활용 예[편집 | 원본 편집]

  • 비밀번호 저장 시스템에서 해시 대신 또는 해시와 병합하여 사용
  • 키 교환(예: Diffie-Hellman) 후 공유된 비밀을 대칭 암호키나 MAC 키로 변환
  • 하나의 마스터 키로부터 여러 하위 키를 유도 (키 다변화, 키 분할)
  • 암호 프로토콜에서 세션 키, 인증 키 등을 생성

한계 및 도전[편집 | 원본 편집]

  • 비용을 너무 높이면 사용자 경험이 나빠질 수 있다
  • 연산 비용만 늘리는 방식은 병렬 하드웨어 공격 대비 불충분할 수 있다
  • 설계 오류 또는 파라미터 미스매치가 보안 취약점을 초래할 수 있다
  • 반복 횟수나 비용 기준을 어떻게 지속적으로 업데이트할지 관리가 필요하다

같이 보기[편집 | 원본 편집]

참고 문헌[편집 | 원본 편집]

  • Elaine Barker, Lily Chen, Richard Davis, NIST SP 800‑56C Rev. 2: Recommendation for Key‑Derivation Methods in Key‑Establishment Schemes
  • Hugo Krawczyk, "Cryptographic Extraction and Key Derivation: The HKDF Scheme"
  • Colin Percival, "Stronger Key Derivation via Sequential Memory‑Hard Functions"
  • Burt Kaliski, "PKCS #5: Password-Based Cryptography Specification, Version 2.0"

각주[편집 | 원본 편집]