HMAC (Hash-based Message Authentication Code)

암호학수정일

HMAC(Hash-based Message Authentication Code, 해시 기반 메시지 인증 코드)는 비밀 키와 해시 함수를 결합해 메시지가 변조되지 않았고 키를 가진 사람이 보냈다는 것을 확인하는 메시지 인증 코드입니다. 1996년 미히르 벨라레(Mihir Bellare), 란 카네티(Ran Canetti), 휴고 크라프치크(Hugo Krawczyk)가 설계했고 RFC 2104와 NIST FIPS 198-1에 표준화되어 있습니다.

자세히 알아보기

계산식은 HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))입니다. K′는 해시 블록 크기에 맞춘 키, ipad는 0x36, opad는 0x5c를 반복한 상수입니다. 해시를 안팎으로 두 번 적용하는 이 구조 덕분에, 단순히 H(K ‖ m)을 쓸 때 SHA-256 같은 머클-담고르 해시에서 생기는 '길이 확장 공격'을 막을 수 있습니다. 안전성은 해시 함수의 압축 함수가 의사난수 함수라는 비교적 약한 가정에 기반합니다.

HMAC은 사용하는 해시에 따라 HMAC-SHA256, HMAC-SHA512 등으로 부릅니다. 흥미롭게도 MD5·SHA-1의 충돌 공격이 HMAC-MD5·HMAC-SHA1의 MAC 안전성을 바로 깨뜨리지는 않았지만, 새 시스템에서는 SHA-2 또는 SHA-3 기반을 쓰는 것이 권장됩니다. 검증할 때는 비교 시간이 결과에 따라 달라지지 않는 상수 시간 비교를 사용해야 부채널 공격을 피할 수 있습니다. HMAC은 기밀성을 제공하지 않으므로, 암호화가 필요하면 AES-GCM 같은 인증 암호화를 함께 씁니다.

HMAC은 다른 암호 구성의 기본 부품이기도 합니다. 키 유도 함수 HKDF(RFC 5869), 비밀번호 기반 키 유도 PBKDF2, 일회용 비밀번호 HOTP/TOTP(RFC 4226/6238), ECDSA 결정적 난수(RFC 6979)가 모두 HMAC 위에 만들어졌습니다.

블록체인·암호화폐에서는

많은 중앙화 거래소가 REST API 요청에 API 비밀 키로 계산한 HMAC-SHA256 서명을 붙이도록 요구합니다. 이 서명 덕분에 서버는 요청이 키 소유자에게서 왔고 중간에 바뀌지 않았음을 확인합니다. 지갑 쪽에서는 BIP-32가 HMAC-SHA512로 마스터 키와 자식 키를 유도하고, BIP-39는 니모닉에서 시드를 만들 때 PBKDF2-HMAC-SHA512를 2048회 반복합니다. 거래소 2단계 인증 앱의 6자리 코드(TOTP)도 HMAC으로 계산됩니다.

쉽게 말하면

편지 내용과 둘만 아는 비밀 단어를 섞어 만든 '봉인 스탬프'입니다. 내용이 한 글자라도 바뀌거나 비밀 단어를 모르는 사람이 만들면 스탬프가 맞지 않습니다.

이 글은 학습을 위한 일반 정보이며 투자 권유나 법률 자문이 아닙니다. 가상자산은 가격 변동이 크고 원금 손실 위험이 있습니다.