HMAC

섬네일|HMAC-SHA1 생성

암호학에서 **HMAC**(keyed-hash message authentication code, hash-based message authentication code)는 암호화 해시 함수와 기밀 암호화 키를 수반하는 특정한 유형의 메시지 인증 코드(MAC)이다. 여느 MAC처럼 메시지의 데이터 무결성과 진본 확인을 동시에 수행하기 위해 사용할 수 있다.

## 상세 설명
SHA-2, SHA-3 등의 암호화 해시 함수는 HMAC 연산을 위해 사용할 수 있다. 그 결과가 되는 MAC 알고리즘은 HMAC-X이며 여기서 X는 사용이 되는 해시 함수(예: HMAC-SHA256 또는 HMAC-SHA3-256)를 의미한다. HMAC의 암호화 등급은 그 기반이 되는 해시 함수의 암호화 등급, 해시 출력의 크기, 키의 크기와 품질에 따라 달라진다.

HMAC는 메시지를 암호화하지 않는다. 그 대신, 메시지의 암호화 여부에 관계 없이 메시지는 HMAC 해시와 함께 송신되어야 한다. 기밀 키를 가진 쌍방은 스스로가 다시 메시지를 해싱하게 되며 진본인 경우 수신 후 연산되는 해시가 일치하게 된다.

HMAC 구성의 정의와 분석은 1996년 Mihir Bellare, Ran Canetti, and Hugo Krawczyk의 논문에 처음 출간되었으며 이들은 1997년 RFC 2104를 작성하기도 했다. 또, 1996년 논문은 NMAC라는 내포형(nested) 변종을 정의하였다. FIPS PUB 198은 HMAC의 이용을 일반화하고 표준화한다. HMAC는 IPsec, SSH, TLS 프로토콜, 그리고 JSON 웹 토큰에 사용된다.

## 정의
이 정의는 RFC 2104에서 발췌한 것이다:

:\begin{align}
  \operatorname{HMAC}(K, m) &= \operatorname{H}\Bigl(\bigl(K' \oplus opad\bigr) \parallel
\operatorname{H} \bigl(\left(K' \oplus ipad\right) \parallel m\bigr)\Bigr) \\
                         K' &= \begin{cases}
                                 \operatorname{H}\left(K\right) & K\text{ is larger than block size} \\
                                 K                              & \text{otherwise}
                                \end{cases}
\end{align}

여기서
: H는 암호화 해시 함수이다
: m은 인증 대상 메시지이다
: K는 기밀 키이다
: K는 기밀 키 K에서 파생된 블록 크기 키이다
: ||는 문자열 연결을 의미한다
: ⊕는 비트 배타적 논리합(XOR)을 의미한다
: opad는 블록 크기의 외부 패딩으로서, 반복되는 0x5c 값 바이트로 구성된다
: 는 블록 크기의 내부 패딩으로서 반복되는 0x36 값 바이트로 구성된다

## 구현
다음 의사코드는 HMAC가 어떻게 구현될 수 있는지를 증명한다. 다음 해시 함수 중 하나를 사용할 때 블록크기는 64바이트이다: SHA-1, MD5, RIPEMD-128/160.

 ***' hmac ***'
     ***'
         key:        Bytes    <span style="color:green">// Array of bytes</span>
         message:    Bytes    <span style="color:green">// Array of bytes to be hashed</span>
         hash:       Function <span style="color:green">// The hash function to use (e.g. SHA-1)</span>
         blockSize:  Integer  <span style="color:green">// The block size of the hash function (e.g. 64 bytes for SHA-1)</span>
         outputSize: Integer  <span style="color:green">// The output size of the hash function (e.g. 20 bytes for SHA-1)</span>

     <span style="color:green">// Keys longer than ''blockSize'' are shortened by hashing them</span>
     ***' (length(key) > blockSize) ***'
         key ← hash(key) <span style="color: green;">// key is ''outputSize'' bytes long</span>

     <span style="color:green">// Keys shorter than ''blockSize'' are padded to ''blockSize'' by padding with zeros on the right</span>
     ***' (length(key)  ***'
         key ← Pad(key, blockSize) <span style="color:green">// Pad key with zeros to make it ''blockSize'' bytes long</span>

     o_key_pad ← key xor [0x5c * blockSize]   <span style="color:green">// Outer padded key</span>
     i_key_pad ← key xor [0x36 * blockSize]   <span style="color:green">// Inner padded key</span>

     ***' hash(o_key_pad ∥ hash(i_key_pad ∥ message))

## 예시
다음은 8비트 ASCII 또는 UTF-8 인코딩 사용을 상정한, 일부 비어있지 않은 HMAC 값이다:
 HMAC_MD5("key", "The quick brown fox jumps over the lazy dog")    = 80070713463e7749b90c2dc24911e275
 HMAC_SHA1("key", "The quick brown fox jumps over the lazy dog")   = de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
 HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

## 같이 보기
* HMAC 기반 일회용 비밀번호
## 각주

; 참고 자료

* Mihir Bellare, Ran Canetti and Hugo Krawczyk, Keying Hash Functions for Message Authentication, :en:CRYPTO 1996, pp. 1–15 (PS or PDF) .
* Mihir Bellare, Ran Canetti and Hugo Krawczyk, Message authentication using hash functions: The HMAC construction, *CryptoBytes* 2(1), Spring 1996 (PS or PDF) .

## 외부 링크
* RFC2104
* Online HMAC Generator / Tester Tool
* FIPS PUB 198-1, ''The Keyed-Hash Message Authentication Code (HMAC)'' 
* C HMAC implementation
* Python HMAC implementation
* Java implementation

분류:메시지 인증 코드
분류:해싱