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의 논문에 처음 출간되었으며[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
각주
[편집]- ↑ Bellare, Mihir; Canetti, Ran; Krawczyk, Hugo (1996). “Keying Hash Functions for Message Authentication”: 1–15. CiteSeerX 10.1.1.134.8430.
- ↑ "Definition of HMAC". HMAC: Keyed-Hashing for Message Authentication. sec. 2. RFC 2104. https://tools.ietf.org/html/rfc2104#section-2.
- 참고 자료
- Mihir Bellare, Ran Canetti and Hugo Krawczyk, Keying Hash Functions for Message Authentication, en:CRYPTO 1996, pp. 1–15 (PS or PDF) Archived 2009년 5월 9일 - 웨이백 머신.
- Mihir Bellare, Ran Canetti and Hugo Krawczyk, Message authentication using hash functions: The HMAC construction, CryptoBytes 2(1), Spring 1996 (PS or PDF) Archived 2009년 5월 9일 - 웨이백 머신.