104. NMAC (Nested MAC)

⚠️ 이 문서는 해시 함수 기반 인증 코드의 수학적 증명을 위해 고안된 중첩 아키텍처이자, 실무의 절대 표준인 HMAC을 탄생시킨 이론적 조상(원형)인 NMAC을 다룹니다.

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

  1. 본질: NMAC(Nested MAC)은 데이터 무결성과 인증을 확보하기 위해, 독립적인 두 개의 비밀키($K_1, K_2$)를 사용하여 내부 해시와 외부 해시를 중첩(Nested)해서 돌리는 이론적인 암호학적 해시 아키텍처다.
  2. 가치: "왜 단순히 해시에 키를 붙이면 안 되고 굳이 샌드위치처럼 두 번을 싸야 하는가?"에 대한 강력한 수학적 증명(Provable Security)을 역사상 처음으로 제공하여 길이 확장 공격 등을 방어하는 논리적 뼈대를 세웠다.
  3. 한계/융합: 두 개의 독립된 키를 관리해야 하고 해시 알고리즘 내부 코어에 접근해야 하는 구현상의 엄청난 불편함 때문에 실무에서는 거의 쓰이지 않았으며, 이를 개발자 친화적으로 단일 키(Single Key) 하나만 쓰도록 실용적으로 개량한 것이 바로 오늘날의 HMAC이다.

Ⅰ. 개요 및 탄생 배경 (Context & Necessity)

1990년대 해시 함수(MD5, SHA-1)를 인증에 쓰기 위해 개발자들은 평문 데이터에 비밀번호를 단순하게 섞어 썼다 (Hash(Key || Message)). 그러나 앞서 다룬 것처럼 이는 길이 확장 공격(Length Extension Attack)이라는 수학적 결함에 치명적으로 뚫려버렸다.

1996년 미히르 벨라레(Mihir Bellare)를 포함한 암호학자들은 "해시 함수를 건드리지 않으면서, 해커가 절대 뚫을 수 없다는 것을 수학적으로 100% 증명할 수 있는 안전한 인증 구조"를 설계해야 했다. 그 결과 도출된 것이, 마치 마트료시카 인형처럼 해시 상자 안에 해시 상자를 넣고 각 상자마다 다른 자물쇠(Key)를 채우는 구조인 **NMAC (Nested MAC, 중첩 인증 코드)**이다.

📢 섹션 요약 비유: 그냥 일기장 끝에 사인을 남겼더니 위조범이 글을 몰래 더 적고 사인을 조작했습니다. NMAC은 일기장을 작은 비밀 금고($K_1$)에 넣고, 그걸 다시 큰 비밀 금고($K_2$)에 넣어버려 위조범이 손댈 수 있는 여지를 원천 차단한 이중 금고 시스템의 최초 아이디어입니다.


Ⅱ. NMAC의 작동 원리와 이론적 우수성

NMAC의 핵심은 "밖에서 안을 공격할 수 없고, 안에서 밖을 건드릴 수 없다"는 완벽한 분리(Isolation)다. 이를 위해 2개의 전혀 다른 비밀키($K_1, K_2$)를 사용한다.

NMAC의 수학적 샌드위치 연산 공식

$NMAC(K_1, K_2, M) = H_{K_2} \Big( H_{K_1}(M) \Big)$

  1. 내부 해싱 (Inner Hash):
    • 평문 메시지($M$)를 해시 믹서기에 넣는다.
    • 이때 중요한 점은, 믹서기의 '초기 상태값(IV)'을 표준값으로 쓰지 않고, 사용자의 **첫 번째 비밀키($K_1$)**로 갈아 끼워서 해싱을 돌린다. $\rightarrow$ 결과물: 내부 해시값
  2. 외부 해싱 (Outer Hash):
    • 방금 나온 내부 해시 덩어리를 다시 해시 믹서기에 넣는다.
    • 이때 믹서기의 '초기 상태값(IV)'을 **두 번째 비밀키($K_2$)**로 갈아 끼워 돌린다. $\rightarrow$ 최종: NMAC 태그
┌──────────────────────────────────────────────────────────────┐
│           NMAC (이중 금고와 독립된 키)의 중첩 해싱 시각화    │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│ [ 1단계: 내부 처리 ]                                         │
│    평문 데이터(M) ──▶ ┌───────── (해시 엔진 H) ─────────┐    │
│                    │ (초기화 변수 대신 비밀키 K1을 삽입!) │  │
│                    └─────────────────┬─────────────┘         │
│                                      │                       │
│                                      ▼                       │
│                              [ 중간 쓰레기 덩어리 ]          │
│                                      │                       │
│ [ 2단계: 외부 래핑 ]                   ▼                     │
│                    ┌───────── (해시 엔진 H) ─────────┐       │
│                    │ (초기화 변수 대신 비밀키 K2를 삽입!) │  │
│                    └─────────────────┬─────────────┘         │
│                                      │                       │
│                                      ▼                       │
│                            ★ [ 최종 NMAC 태그 ] ★            │
└──────────────────────────────────────────────────────────────┘

[다이어그램 해설] NMAC이 왜 수학적으로 위대할까? 해커가 1단계의 결과물(내부 해시)에 뭔가 조작된 문자를 덧붙이려(길이 확장 공격) 시도하더라도, 2단계에서 전혀 다른 외계어 열쇠($K_2$)로 껍데기를 통째로 한 번 더 갈아버리기 때문에 해커의 조작 시도가 믹서기 밖으로 튀어나오지 못하고 소멸해 버린다. 수학자들은 "해시 함수 H 자체가 완전히 뚫리지 않는 이상, 이 NMAC 껍데기를 뚫는 것은 우주적으로 불가능하다"는 논문을 발표하며 환호했다.

  • 📢 섹션 요약 비유: 해커가 바늘로 찌르는 공격을 막으려면 갑옷을 두 겹 입어야 합니다. 그런데 똑같은 재질의 갑옷을 두 벌 입으면 구멍이 겹칠 수 있으니, 안에는 다이아몬드 갑옷($K_1$)을 입고 밖에는 티타늄 갑옷($K_2$)을 입는 것이 완벽하다는 것을 수학적으로 계산해 낸 설계도가 NMAC입니다.

Ⅲ. 실무적 실패: HMAC으로의 진화 (Trade-off)

이론적으로 완벽했던 NMAC은 막상 개발자(프로그래머)들의 손에 쥐여주자 엄청난 원성을 샀다. 그 이유는 구현의 끔찍한 불편함 때문이었다.

  1. 키 관리가 2배: 비밀번호를 1개도 관리하기 힘든데, 서버가 항상 독립적이고 안전한 2개의 키($K_1, K_2$)를 관리해야 하는 부담이 컸다.
  2. 해시 라이브러리의 마개조 필요: 일반 개발자들은 운영체제나 언어(Java, Python)에서 제공하는 해시 함수인 SHA256() 모듈을 그냥 가져다(Black-box) 쓰고 싶어 한다. 그런데 NMAC은 알고리즘 안에 쑥 들어가서 깊숙이 박혀있는 '초기화 변수(IV)'를 뜯어내고 내 키($K_1$)로 교체하는 마개조 수술을 요구했다.

해결책 (HMAC의 탄생): 학자들은 개발자들의 불평을 수용했다. "그래, 키 2개 쓰지 마. 네가 가진 키($K$) 딱 1개만 가져와. 우리가 그 키를 0x36(ipad)으로 버무려서 가짜 $K_1$을 만들어주고, 0x5C(opad)로 버무려서 가짜 $K_2$를 만들어서 NMAC처럼 돌려줄게! 넌 그냥 함수만 호출해!" 이것이 HMAC이다. 즉, HMAC은 단일 키 하나로 NMAC의 쌍발 엔진 효과를 시뮬레이션해 낸 실전형 개조 버전이다.


Ⅳ. 결론

"이론의 완벽함이 실무의 편의성으로 타협되는 기술 진화의 훌륭한 표본." NMAC 자체는 오늘날 당신의 서버나 코드에 직접 쓰이는 일이 거의 없다. 하지만 NMAC이 없었다면 현대 인증의 황제인 HMAC도 탄생할 수 없었다. NMAC은 해시 함수를 샌드위치처럼 두 번 중첩하면 해커의 조작 공격을 완벽히 흡수할 수 있다는 진리를 인류에게 최초로 증명한 위대한 선구자로서 암호학 교과서의 가장 깊은 곳에 영원히 새겨져 있다.


📌 관련 개념 맵

  • 후계자 (실무 표준): HMAC (Hash-based Message Authentication Code)
  • 제공하는 보안 속성: 무결성 증명, 발신자 인증 (MAC)
  • 방어하는 치명적 취약점: 길이 확장 공격 (Length Extension Attack)
  • 보안 공학의 딜레마: 증명 가능한 보안(Provable Security) vs 구현 편의성(Implementation Ease)

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

  1. 편지 봉투에 도둑이 손대지 못하게 마법 도장 2개를 쾅쾅 찍는 완벽한 방어법(NMAC)을 학자들이 만들어 냈어요.
  2. 그런데 이 방법은 색깔이 아예 다른 비싼 마법 잉크(열쇠)를 2통이나 사야 했고, 도장 기계를 분해해서 조립해야 해서 사람들이 너무 귀찮아했어요.
  3. 그래서 똑똑한 엔지니어들이 잉크 1통만 사서 물과 기름을 살짝 섞어 2통인 척 쓰면서도, 방어력은 똑같이 완벽한 개량형 도장(HMAC)을 만들어내서 지금은 다 그것만 쓰고 있답니다!