136. HKDF (HMAC-based Key Derivation Function)
⚠️ 이 문서는 "서로 합의한 하나의 비밀 난수(씨앗)에서, 암호화용 키, 인증용 키, 다음 세션용 키 등 용도가 완전히 다른 여러 개의 안전한 파생 키(Child Keys)를 안전하고 체계적으로 뽑아내는 수학적 정수기"이자, 현대 TLS 1.3과 메신저 암호화의 혈관 역할을 하는 HKDF 표준 규격을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: HKDF는 HMAC 해시 엔진을 사용하여, 길이가 들쭉날쭉하고 무작위성이 부족한 초기 비밀 난수(Seed)를 **추출(Extract)**하여 순도 높은 고농축 원액으로 만든 뒤, 필요한 길이만큼 여러 개의 새로운 마스터키들로 **확장(Expand)**시켜 뽑아내는 키 파생 함수(KDF) 표준이다.
- 가치: 대충 섞은 1개의 씨앗(Pre-Master Secret)만으로 서버와 클라이언트가 암호화용($K_{enc}$), 무결성 검증용($K_{mac}$), 서버용/클라이언트용 등 수십 개의 안전하고 독립적인 열쇠 더미를 똑같이 붕어빵처럼 찍어낼 수 있게 해준다.
- 융합: 이 추출-확장(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는 단순히 암호학 논문 속에 있는 유희가 아니라, 현재 당신의 크롬 브라우저가 접속하는 인터넷 생태계의 대동맥이다.
- TLS 1.3의 핵심 키 스케줄 엔진
- 과거 TLS 1.2까지는 키를 뽑아낼 때 PRF(Pseudo-Random Function)라는 다소 복잡하고 누더기 같은 비표준 함수를 썼다.
- TLS 1.3 스펙부터는 이 누더기를 싹 다 갖다 버리고 **"오직 무조건 HKDF 구조만 써서 모든 통신 키를 뽑아내라!"**고 전 세계 브라우저와 서버에 강제 규정을 때려 박았다.
- 시그널(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줄 비유 설명
- 철수와 영희가 "우리 비밀번호는 '사과'로 하자!"고 합의했어요. 하지만 이대로 쓰면 너무 뻔해서 해커한테 바로 들키겠죠.
- 그래서 철수와 영희는 똑같은 'HKDF'라는 마법의 자판기를 샀어요. 여기에 '사과'라는 단어를 넣고 버튼을 꾹! 누르죠.
- 자판기가 윙윙 돌더니 "1번 암호화 자물쇠 열쇠", "2번 편지 도장 열쇠", "3번 내일 쓸 열쇠" 등 똑같이 생긴 엄청나게 단단하고 복잡한 열쇠 10개를 촥! 하고 뱉어내서, 둘이 똑같이 나눠 갖고 평화롭게 통신하게 해 준답니다.