136. HKDF (HMAC-based Key Derivation Function)

⚠️ 이 문서는 "서로 합의한 하나의 비밀 난수(씨앗)에서, 암호화용 키, 인증용 키, 다음 세션용 키 등 용도가 완전히 다른 여러 개의 안전한 파생 키(Child Keys)를 안전하고 체계적으로 뽑아내는 수학적 정수기"이자, 현대 TLS 1.3과 메신저 암호화의 혈관 역할을 하는 HKDF 표준 규격을 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: HKDF는 HMAC 해시 엔진을 사용하여, 길이가 들쭉날쭉하고 무작위성이 부족한 초기 비밀 난수(Seed)를 **추출(Extract)**하여 순도 높은 고농축 원액으로 만든 뒤, 필요한 길이만큼 여러 개의 새로운 마스터키들로 **확장(Expand)**시켜 뽑아내는 키 파생 함수(KDF) 표준이다.
  2. 가치: 대충 섞은 1개의 씨앗(Pre-Master Secret)만으로 서버와 클라이언트가 암호화용($K_{enc}$), 무결성 검증용($K_{mac}$), 서버용/클라이언트용 등 수십 개의 안전하고 독립적인 열쇠 더미를 똑같이 붕어빵처럼 찍어낼 수 있게 해준다.
  3. 융합: 이 추출-확장(Extract-and-Expand)이라는 우아한 2단계 아키텍처 덕분에, TLS 1.3의 복잡한 핸드셰이크 키 생성 트리를 완벽하게 통제하고, WhatsApp이나 Signal 같은 엔드투엔드(E2E) 메신저에서 매 메시지마다 열쇠를 바꾸는 래칫(Ratchet) 구조의 핵심 엔진으로 융합되어 쓰인다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

디피-헬만(DH) 키 교환을 통해 앨리스와 밥이 188a3b... 라는 거대한 쓰레기 숫자(공유 비밀, Shared Secret)를 극적으로 똑같이 맞춰내는 데 성공했다! 만세!

그런데 현실의 시스템 엔지니어는 골머리를 앓는다. "야, 이 숫자 덩어리 하나로 뭘 어쩌라고? 우리는 영화 데이터를 잠글 256비트짜리 AES 암호 키($K_{enc}$)도 필요하고, 해커가 조작 못 하게 도장을 찍을 HMAC 인증 키($K_{mac}$)도 따로 필요해. 그리고 이 숫자 덩어리는 난수 질(Entropy)이 썩 좋지도 않아!"

과거의 야매 코딩: 초보 개발자들은 SHA256(비밀숫자 + "encryption") 해서 암호화 키를 뽑고, SHA256(비밀숫자 + "mac") 해서 인증 키를 뽑는 짓을 했다. 하지만 수학적 증명이 되지 않은 이런 하드코딩은 해커의 변형 공격에 쉽게 무너졌다.

해결사 HKDF의 등판 (RFC 5869): 휴고 크라브치크(Hugo Krawczyk)는 2010년, 오직 튼튼하게 입증된 HMAC 엔진만을 사용하여 "어떤 더러운 씨앗이 들어오든 완벽한 무작위성을 가진 수십 개의 새로운 열쇠로 증식시켜 주는" 2단계 공장, HKDF를 표준 규격으로 세상에 내놓았다.

📢 섹션 요약 비유: 금광에서 금이 섞인 거친 돌덩이 하나(Shared Secret)를 캐왔습니다. 이걸 그대로 망치로 부숴서 쓸 수는 없습니다. HKDF 공장은 1단계로 돌덩이를 뜨거운 용광로에 녹여 순도 99.9%의 맑은 금괴(Extract)로 만들고, 2단계로 그 금괴를 길게 늘여서 암호화용 열쇠, 인증용 열쇠, 대문 열쇠 등 내가 원하는 모양의 황금 열쇠 10개(Expand)로 예쁘게 찍어내 주는 완벽한 제련소입니다.


Ⅱ. HKDF 공장의 완벽한 2단계 아키텍처

HKDF는 "추출(Extract) $\rightarrow$ 확장(Expand)" 이라는 철저하게 분업화된 2단계 파이프라인으로 설계되었다. 이 구조의 미학은 덜 정제된 재료를 고순도로 씻어내는 작업과 양을 부풀리는 작업을 완벽히 분리했다는 점이다.

1단계: 추출 (Extract) - 용광로

  • 목적: 디피-헬만 교환으로 얻은 초기 비밀(IKM, Input Keying Material)은 특정 숫자에 몰려 있거나 패턴이 남아있을 수 있다(무작위성, 엔트로피 부족). 이를 모아서 꽉 압축해 고순도 원액으로 만든다.
  • 수식: PRK = HMAC-Hash(Salt, IKM)
  • 과정: 아무 의미 없는 무작위 소금(Salt)을 자물쇠 키로 삼아, 밍밍한 초기 비밀(IKM)을 HMAC 믹서기에 넣고 아주 강하게 쥐어짠다.
  • 결과물: 믹서기를 통과하여 튀어나온 PRK (Pseudorandom Key, 의사 난수 키). 이 PRK는 크기는 짧지만(예: 256비트), 우주의 완벽한 무작위성을 띤 고농축 마법의 원액이 된다.

2단계: 확장 (Expand) - 붕어빵 기계

  • 목적: 고농축 원액(PRK) 한 컵을 가지고, 서버가 필요로 하는 암호화 키, 서명 키 등 수천 바이트 길이의 다양한 파생 키 조각들을 줄줄이 뽑아낸다.
  • 수식: Output = HMAC-Hash(PRK, Info + Counter)
  • 과정: 원액(PRK)을 HMAC의 믹서기 키로 장착한다. 그리고 믹서기 통 안에는 Info(이 키의 용도를 적은 꼬리표, 예: "client_encryption_key")와 숫자 1, 2, 3 **(Counter)**를 넣고 계속 갈아낸다.
  • 결과물: "암호화용 256비트 키", "인증용 256비트 키" 등이 필요할 때마다 무한대로 안전하게 똑똑 떨어진다.
┌─────────────────────────────────────────────────────────────────────────┐
│           HKDF의 2단계 (추출-확장) 파이프라인 흐름도 시각화             │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│ [ 1. Extract (추출) 단계: 순도 99.9% 원액 만들기 ]                      │
│    (덜 섞인 밍밍한 DH 비밀숫자)          (공개된 무작위 소금 Salt)      │
│             │                            │                              │
│             └───────▶ [ HMAC 믹서기 ] ◀──────┘                          │
│                              │                                          │
│                              ▼                                          │
│                  ★ [ PRK (고농축 마스터 원액) ] ★                       │
│                                                                         │
│ [ 2. Expand (확장) 단계: 용도별로 키 쭉쭉 뽑아내기 ]                    │
│                                                                         │
│         Info("웹서버 암호용")     Info("웹서버 인증용")                 │
│                 │                  │                                    │
│   PRK ──▶ [ HMAC 믹서기 ]  PRK ──▶ [ HMAC 믹서기 ]                      │
│                 │                  │                                    │
│                 ▼                  ▼                                    │
│            [ AES-256 키 ]       [ HMAC-SHA 인증키 ]                     │
│             (통신 암호화)           (변조 방지용 도장)                  │
│                                                                         │
│ * 핵심: 앨리스와 밥이 처음에 '밍밍한 비밀숫자' 하나만 똑같이 맞췄다면,  │
│   이 HKDF 공장을 거치고 난 뒤엔 똑같은 용도별 열쇠 10개를 양쪽이        │
│   완벽하게 일치하게 손에 쥐게 된다! 통신 준비 완료!                     │
└─────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 초보 개발자의 가장 큰 실수는 평문 비밀번호나 DH 결과물을 그대로 AES 자물쇠의 키 배열(Array)에 밀어 넣는 것이다. 만약 값이 짧으면 0으로 채우는(Zero-padding) 끔찍한 짓을 한다. HKDF는 이런 인간의 무식을 용납하지 않는다. Info("app_v1_db_key")라는 꼬리표 시스템 덕분에, 하나의 PRK 원액을 가지고 수백 개의 모듈이 각자 완벽하게 다른 키를 파생해 쓰면서도 절대 키가 서로 겹쳐서 털리는 일(Key Confusion)이 수학적으로 발생하지 않게(Domain Separation) 막아준다.

  • 📢 섹션 요약 비유: 마트에서 산 싸구려 원두(IKM)를 그냥 뜨거운 물에 부으면 맛없는 커피가 나옵니다. HKDF는 이 원두를 최고급 에스프레소 머신으로 꽉 짜내어 엄청나게 진한 원액(PRK)을 만듭니다. 그리고 이 원액 1방울에 물과 우유(Info)를 요리조리 타서, 뜨거운 아메리카노(암호화 키), 달콤한 라떼(인증 키), 시원한 프라푸치노(다음 세션 키) 등 내가 원하는 모든 메뉴를 완벽한 맛으로 척척 뽑아내 줍니다.

Ⅲ. 실무 융합 및 트렌드 장악 (TLS 1.3의 대동맥)

HKDF는 단순히 암호학 논문 속에 있는 유희가 아니라, 현재 당신의 크롬 브라우저가 접속하는 인터넷 생태계의 대동맥이다.

  1. TLS 1.3의 핵심 키 스케줄 엔진
    • 과거 TLS 1.2까지는 키를 뽑아낼 때 PRF(Pseudo-Random Function)라는 다소 복잡하고 누더기 같은 비표준 함수를 썼다.
    • TLS 1.3 스펙부터는 이 누더기를 싹 다 갖다 버리고 **"오직 무조건 HKDF 구조만 써서 모든 통신 키를 뽑아내라!"**고 전 세계 브라우저와 서버에 강제 규정을 때려 박았다.
  2. 시그널(Signal) 프로토콜의 이중 래칫 (Double Ratchet)
    • 왓츠앱과 카톡 비밀 채팅은 상대방이 카톡 1개를 보낼 때마다 암호 키를 매번 새것으로 교체해 버려, 해커가 폰을 해킹해도 과거 카톡을 절대 못 보게 막는다.
    • 이 "1카톡 당 1회용 키 교체"라는 미친 연산의 뼈대가 바로 HKDF다. 방금 쓴 키를 HKDF에 넣고 갈아서 다음 카톡용 키를 만들고, 그걸 또 갈아서 다음 키를 만드는 식으로 사다리를 탄다.

Ⅳ. 결론

"어설픈 비밀 하나를 완벽한 보안 제국으로 확장시키는 암호학적 빅뱅." 디피-헬만(DH)이 앨리스와 밥 사이의 좁은 오솔길을 뚫어주었다면, HKDF는 그 흙길 위에 아스팔트를 깔고 왕복 8차선 고속도로(다양한 보안 키 파생)를 쫙쫙 뻗게 해 준 인프라 건축술의 결정체다. HMAC이라는 단단한 블록 하나만을 재활용하여 추출(Extract)과 확장(Expand)이라는 우아한 2단계 파이프라인을 완성한 이 KDF 표준은, 현대 암호 공학이 얼마나 아름답고 빈틈없이 모듈화될 수 있는지를 증명하는 기념비적인 걸작이다.


📌 관련 개념 맵

  • 전체 분류: KDF (Key Derivation Function, 키 도출/파생 함수)
  • 내부 핵심 엔진: HMAC (해시 기반 메시지 인증 코드 - 내부적으로 SHA-256 등을 사용)
  • 단계별 구성: Extract 단계 (엔트로피 집중), Expand 단계 (원하는 길이의 키 복사본 뻥튀기)
  • 활용 규격: TLS 1.3 키 스케줄 (Key Schedule), Signal Protocol E2EE

👶 어린이를 위한 3줄 비유 설명

  1. 철수와 영희가 "우리 비밀번호는 '사과'로 하자!"고 합의했어요. 하지만 이대로 쓰면 너무 뻔해서 해커한테 바로 들키겠죠.
  2. 그래서 철수와 영희는 똑같은 'HKDF'라는 마법의 자판기를 샀어요. 여기에 '사과'라는 단어를 넣고 버튼을 꾹! 누르죠.
  3. 자판기가 윙윙 돌더니 "1번 암호화 자물쇠 열쇠", "2번 편지 도장 열쇠", "3번 내일 쓸 열쇠" 등 똑같이 생긴 엄청나게 단단하고 복잡한 열쇠 10개를 촥! 하고 뱉어내서, 둘이 똑같이 나눠 갖고 평화롭게 통신하게 해 준답니다.