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

HMAC-SHA1 생성

상세 설명

편집

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의 논문에 처음 출간되었으며[1] 이들은 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 값 바이트로 구성된다
ipad는 블록 크기의 내부 패딩으로서 반복되는 0x36 값 바이트로 구성된다

구현

편집

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

function hmac is
    input:
        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
    if (length(key) > blockSize) then
        key ← hash(key) // key is outputSize bytes long
    // Keys shorter than blockSize are padded to blockSize by padding with zeros on the right
    if (length(key) < blockSize) then
        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
    return 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

각주

편집
  1. Bellare, Mihir; Canetti, Ran; Krawczyk, Hugo (1996). “Keying Hash Functions for Message Authentication”: 1–15. CiteSeerX 10.1.1.134.8430. 
  2. "Definition of HMAC". HMAC: Keyed-Hashing for Message Authentication. sec. 2. RFC 2104. https://tools.ietf.org/html/rfc2104#section-2. 
참고 자료

외부 링크

편집