HMAC 생성기 완벽 가이드
HMAC(Hash-based Message Authentication Code)은 암호화 해시 함수와 시크릿 키를 결합하여 메시지의 무결성(integrity)과 인증(authentication)을 동시에 보장하는 메시지 인증 코드(MAC) 알고리즘입니다. 1996년 Mihir Bellare, Ran Canetti, Hugo Krawczyk에 의해 제안되었으며, RFC 2104로 표준화되었습니다. HMAC은 현재 TLS/SSL 프로토콜, API 인증(AWS Signature V4, GitHub Webhooks 등), JWT(JSON Web Token) 서명, IPsec VPN 통신 등 인터넷 보안의 핵심 기반 기술로 광범위하게 사용되고 있습니다. 일반 해시 함수와 달리 시크릿 키가 포함되므로, 키를 모르는 제3자가 메시지를 변조하거나 위조된 인증 코드를 생성하는 것이 사실상 불가능합니다.
HMAC의 작동 원리
HMAC은 내부적으로 두 번의 해시 연산을 수행합니다. 먼저 시크릿 키를 해시 함수의 블록 크기에 맞게 패딩한 뒤, 내부 패딩(ipad, 0x36)과 XOR 연산하여 메시지와 결합한 것을 해시합니다. 이 중간 해시값을 다시 외부 패딩(opad, 0x5c)과 XOR한 키와 결합하여 최종 해시를 생성합니다. 수식으로 표현하면 HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m))입니다. 이 이중 해시 구조 덕분에 길이 확장 공격(Length Extension Attack) 등 일반 해시 함수의 취약점으로부터 안전합니다.
HMAC vs 일반 해시 함수
SHA-256 같은 일반 해시 함수는 데이터 무결성만 검증할 수 있습니다. 누구나 같은 해시값을 생성할 수 있기 때문에, 해시값만으로는 메시지의 출처를 인증할 수 없습니다. 반면 HMAC은 시크릿 키를 알고 있는 당사자만 올바른 인증 코드를 생성할 수 있어 메시지의 출처까지 검증할 수 있습니다. 예를 들어, API 서버가 클라이언트에게 시크릿 키를 발급하고, 클라이언트가 요청에 HMAC 서명을 포함하면 서버는 동일한 키로 HMAC을 재계산하여 요청의 진위 여부를 확인합니다.
해시 알고리즘별 HMAC 특성
- HMAC-SHA-1: 160비트(40자) 출력. 레거시 시스템 호환용으로 사용되나 새로운 시스템에서는 권장하지 않습니다.
- HMAC-SHA-256: 256비트(64자) 출력. 보안성과 성능의 균형이 뛰어나 가장 널리 사용됩니다. AWS, GitHub, Stripe 등 주요 API 서비스에서 채택합니다.
- HMAC-SHA-384: 384비트(96자) 출력. TLS 1.3에서 사용되며, SHA-512 기반으로 높은 보안성을 제공합니다.
- HMAC-SHA-512: 512비트(128자) 출력. 최고 수준의 보안이 필요한 환경에서 사용됩니다.
HMAC의 실무 활용 사례
- API 인증: AWS Signature V4, GitHub Webhooks, Stripe Webhooks 등 주요 서비스에서 요청 인증에 HMAC-SHA-256을 사용합니다.
- JWT 서명: JSON Web Token의 HS256 알고리즘은 HMAC-SHA-256으로 토큰의 무결성을 보장합니다.
- Webhook 검증: 서버에서 보낸 Webhook 페이로드가 변조되지 않았는지 HMAC 서명으로 확인합니다.
- 비밀번호 기반 키 도출: PBKDF2 알고리즘 내부에서 HMAC이 핵심 연산으로 사용됩니다.
- 데이터 무결성: 파일 전송이나 통신에서 데이터가 변조되지 않았음을 HMAC으로 검증합니다.
자주 묻는 질문 (FAQ)
Q. HMAC과 일반 해시의 차이점은 무엇인가요?
A. 일반 해시(SHA-256 등)는 키 없이 누구나 동일한 해시값을 생성할 수 있어 데이터 무결성만 검증합니다. HMAC은 시크릿 키를 사용하므로 키를 가진 당사자만 올바른 인증 코드를 만들 수 있어 메시지의 출처 인증과 무결성 검증이 모두 가능합니다.
Q. 시크릿 키의 길이는 얼마나 되어야 하나요?
A. HMAC의 시크릿 키는 최소한 해시 함수의 출력 길이 이상이 권장됩니다. HMAC-SHA-256의 경우 최소 32바이트(256비트) 이상의 랜덤 키를 사용하는 것이 좋습니다. 키가 해시 블록 크기보다 길면 먼저 해시된 후 사용되며, 짧은 키는 0으로 패딩됩니다. 너무 짧거나 추측 가능한 키는 보안 위험이 있습니다.
Q. 이 도구에서 입력한 데이터는 안전한가요?
A. 네, 이 도구는 브라우저에 내장된 Web Crypto API(crypto.subtle)를 사용하여 모든 HMAC 연산을 사용자의 브라우저에서 로컬로 수행합니다. 메시지나 시크릿 키가 서버로 전송되지 않으므로 민감한 데이터도 안전하게 처리할 수 있습니다.
Q. Hex 출력과 Base64 출력은 어떤 차이가 있나요?
A. Hex(16진수)는 바이트를 0-9, a-f 두 글자로 표현하며 디버깅이나 로그 확인에 적합합니다. Base64는 바이트를 A-Z, a-z, 0-9, +, / 문자로 인코딩하여 같은 데이터를 더 짧게 표현합니다. AWS 서명은 Hex, JWT는 Base64를 주로 사용하므로 서비스 요구사항에 맞게 선택하세요.
Q. HMAC-SHA-256은 현재도 안전한가요?
A. 네, HMAC-SHA-256은 2024년 현재 알려진 실질적 공격이 없으며 매우 안전합니다. HMAC 구조 자체가 기저 해시 함수의 충돌 취약점에도 어느 정도 내성을 가지므로, SHA-256의 이론적 취약성이 발견되더라도 HMAC-SHA-256의 안전성이 즉시 위협받지는 않습니다.