HMAC

암호학에서 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에서 발췌한 것이다:

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

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

  hmac 
     
         key:        Bytes    // Array of bytes
         message:    Bytes    // Array of bytes to be hashed
         hash:       Function // The hash function to use (e.g. SHA-1)
         blockSize:  Integer  // The block size of the hash function (e.g. 64 bytes for SHA-1)
         outputSize: Integer  // The output size of the hash function (e.g. 20 bytes for SHA-1)

     // Keys longer than blockSize are shortened by hashing them
      (length(key) > blockSize) 
         key ← hash(key) // key is outputSize bytes long

     // Keys shorter than blockSize are padded to blockSize by padding with zeros on the right
      (length(key) < blockSize) 
         key ← Pad(key, blockSize) // Pad key with zeros to make it blockSize bytes long

     o_key_pad ← key xor [0x5c * blockSize]   // Outer padded key
     i_key_pad ← key xor [0x36 * blockSize]   // Inner padded key

      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

각주 

 참고 자료

 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

메시지 인증 코드
해싱