{{위키데이터 속성 추적}}
[[파일:SHAhmac.svg|섬네일|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의 논문에 처음 출간되었으며<ref name="BCK96">{{저널 인용|title=Keying Hash Functions for Message Authentication |pages=1–15 |first1=Mihir |last1=Bellare |authorlink1=Mihir Bellare |first2=Ran |last2=Canetti |first3=Hugo |last3=Krawczyk |year=1996 |citeseerx=10.1.1.134.8430 }}</ref> 이들은 1997년 RFC 2104<nowiki/>를 작성하기도 했다. 또, 1996년 논문은 NMAC라는 내포형(nested) 변종을 정의하였다. [[연장 정보 처리 표준|FIPS]] PUB 198은 HMAC의 이용을 일반화하고 표준화한다. HMAC는 [[IPsec]], [[시큐어 셸|SSH]], [[전송 계층 보안|TLS]] 프로토콜, 그리고 [[JSON 웹 토큰]]에 사용된다.

== 정의 ==
이 정의는 RFC 2104<nowiki/>에서 발췌한 것이다:

:<math>\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}</math>

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

== 구현 ==
다음 [[의사코드]]는 HMAC가 어떻게 구현될 수 있는지를 증명한다. 다음 해시 함수 중 하나를 사용할 때 블록크기는 64바이트이다: SHA-1, [[MD5]], RIPEMD-128/160.<ref>{{cite IETF |title=HMAC: Keyed-Hashing for Message Authentication |rfc=2104 |section=2 |sectionname=Definition of HMAC}}</ref>

 '''{{Font color|blue|function}}''' hmac '''{{Font color|blue|is}}'''
     '''{{Font color|blue|input:}}'''
         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>
     '''{{Font color|blue|if}}''' (length(key) > blockSize) '''{{Font color|blue|then}}'''
         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>
     '''{{Font color|blue|if}}''' <span style="color:black">(length(key) < blockSize)</span> '''{{Font color|blue|then}}'''
         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>

     '''{{Font color|blue|return}}''' <span style="color:black">hash(o_key_pad ∥ hash(i_key_pad ∥ message))</span>

== 예시 ==
다음은 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_SHA512("key", "The quick brown fox jumps over the lazy dog") = b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a -->

== 각주 ==
{{각주}}
; 참고 자료
{{참고 자료 시작}}
* Mihir Bellare, Ran Canetti and Hugo Krawczyk, Keying Hash Functions for Message Authentication, [[:en:CRYPTO]] 1996, pp. 1–15 [http://www-cse.ucsd.edu/users/mihir/papers/hmac.html#kmd5-paper (PS or PDF)] {{웨이백|url=http://www-cse.ucsd.edu/users/mihir/papers/hmac.html#kmd5-paper |date=20090509205612 }}.
* Mihir Bellare, Ran Canetti and Hugo Krawczyk, Message authentication using hash functions: The HMAC construction, ''CryptoBytes'' 2(1), Spring 1996 [http://www-cse.ucsd.edu/users/mihir/papers/hmac.html#hmac-cryptobytes (PS or PDF)] {{웨이백|url=http://www-cse.ucsd.edu/users/mihir/papers/hmac.html#hmac-cryptobytes |date=20090509205612 }}.
{{참고 자료 끝}}

== 외부 링크 ==
* [http://www.ietf.org/rfc/rfc2104.txt RFC2104]
* [https://codebeautify.org/hmac-generator Online HMAC Generator / Tester Tool]
* [http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf FIPS PUB 198-1, ''The Keyed-Hash Message Authentication Code (HMAC)'']
* [http://www.ouah.org/ogay/hmac/ C HMAC implementation]
* [https://docs.python.org/library/hmac.html Python HMAC implementation]
* [http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#HmacEx Java implementation]

{{암호화 해시}}
{{기본정렬:Hmac}}

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