HMAC Generator

SHA-256, SHA-384 또는 SHA-512를 사용한 HMAC 서명 생성

알고리즘

메시지

로컬에서 실행 · 시크릿 붙여넣기 안전

비밀 키

로컬에서 실행 · 시크릿 붙여넣기 안전

HMAC 서명

HMAC 서명이 여기 표시됩니다…

HMAC이란 무엇인가요?

HMAC(Hash-based Message Authentication Code)은 RFC 2104에 정의된 암호학적 구조로, 해시 함수와 비밀 키를 결합하여 고정 크기의 인증 태그를 생성합니다. 누구나 계산할 수 있는 일반 해시와 달리, HMAC은 비밀 키를 공유하는 당사자만 생성하고 검증할 수 있습니다. HMAC은 메시지의 무결성과 진위성을 모두 검증하는 표준 메커니즘으로, 데이터가 변조되지 않았으며 신뢰할 수 있는 발신자가 생성했음을 확인합니다.

HMAC 알고리즘은 SHA-256, SHA-384, SHA-512는 물론 SHA-1, MD5 같은 레거시 함수 등 모든 반복 해시 함수와 함께 동작합니다. 결과 구조는 기반 해시에 따라 HMAC-SHA256, HMAC-SHA384, HMAC-SHA512로 불립니다. HMAC의 보안 증명이 해시 함수의 충돌 저항성과 특정 의사 난수 특성에 의존하기 때문에, 새로운 시스템에는 SHA-2 계열 알고리즘을 권장합니다. HMAC-SHA256은 가장 널리 배포된 변형으로, AWS Signature V4, Stripe 웹훅, GitHub 웹훅 시크릿, Slack 요청 서명, JSON Web Tokens(HS256)에 사용됩니다.

HMAC의 설계는 일반 해싱이 제공하지 못하는 중요한 특성인 길이 확장 공격에 대한 저항성을 제공합니다. SHA-256만 사용할 경우, H(message)를 아는 공격자는 원래 메시지를 모르더라도 H(message || attacker_data)를 계산할 수 있습니다. HMAC의 이중 해싱 구조(서로 다른 패딩 키를 사용하는 내부 해시와 외부 해시)는 이 공격을 완전히 차단합니다. 이것이 API 서명 방식이 메시지에 비밀 키를 추가하고 해싱하는 방법 대신 HMAC을 사용하는 이유입니다.

온라인 HMAC 생성기를 사용하는 이유

HMAC 서명 계산은 일반적으로 코드 작성이나 CLI 도구 사용이 필요합니다. 이 브라우저 기반 HMAC 생성기를 사용하면 소프트웨어 설치나 터미널 전환 없이 HMAC-SHA256, HMAC-SHA384, HMAC-SHA512 서명을 즉시 생성할 수 있습니다.

즉각적인 HMAC 계산
메시지와 비밀 키를 입력하고 해시 알고리즘을 선택하면 HMAC 서명이 즉시 생성됩니다. Web Crypto API가 브라우저 내에서 네이티브로 계산을 처리합니다.
🔒
프라이버시 우선 처리
메시지와 비밀 키는 기기를 절대 벗어나지 않습니다. 모든 HMAC 계산은 Web Crypto API를 통해 로컬에서 실행되며, 서버 요청, 로깅, 데이터 보관이 없습니다.
📋
다중 알고리즘 지원
클릭 한 번으로 HMAC-SHA256, HMAC-SHA384, HMAC-SHA512 간에 전환할 수 있습니다. 알고리즘 간 출력을 비교하여 백엔드 구현이 일치하는지 확인하세요.
🔍
계정 또는 설치 불필요
모든 최신 브라우저(Chrome, Firefox, Safari, Edge)에서 작동합니다. 회원가입, 확장 프로그램, CLI 설정이 필요 없습니다. 페이지를 열고 바로 HMAC 서명 생성을 시작하세요.

HMAC 생성기 활용 사례

프론트엔드 개발자 — 웹훅 서명 검증
Stripe, GitHub, Shopify는 HMAC-SHA256으로 웹훅 페이로드에 서명합니다. 이 도구를 사용하여 페이로드와 시크릿으로 예상 서명을 계산하고, 개발 중 HTTP 헤더의 서명과 비교해 보세요.
백엔드 엔지니어 — API 요청 서명
AWS Signature V4는 서명 프로세스의 여러 단계에서 HMAC-SHA256을 요구합니다. 개발 중 참조 HMAC 값을 생성하여 서명 불일치를 디버깅하고 중간 계산 단계를 검증하세요.
DevOps — 시크릿 교체 검증
웹훅 시크릿이나 API 서명 키를 교체할 때, 이전 키와 새 키 모두로 HMAC 서명을 계산하여 이전 키가 만료되기 전에 애플리케이션이 전환을 올바르게 처리하는지 확인하세요.
QA 엔지니어 — 서명 테스트 벡터
알려진 입력값과 키로 HMAC 테스트 벡터를 생성하여 인증 미들웨어의 회귀 테스트를 구축하세요. 구현이 빈 메시지, Unicode 입력, 긴 키를 올바르게 처리하는지 확인하세요.
데이터 엔지니어 — 파이프라인 메시지 인증
이벤트 기반 파이프라인(Kafka, SQS)의 메시지에 HMAC 서명을 첨부하여 서비스 간 전송 중 메시지가 변조되지 않았음을 검증하세요.
학생 — 암호학 과제
HMAC을 실험하여 메시지나 키의 문자 하나를 변경하면 완전히 다른 서명이 생성되는 원리를 이해해 보세요. HMAC 출력과 일반 SHA-256 출력을 비교하여 비밀 키가 만드는 차이를 관찰하세요.

HMAC vs 일반 해시 vs 암호화

HMAC, 일반 해싱, 암호화는 각각 다른 목적을 제공합니다. HMAC은 메시지 인증을 제공하며, 비밀 키를 가진 누군가가 메시지를 생성했고 수정되지 않았음을 증명합니다. 일반 해시는 무결성을 제공하지만 인증은 제공하지 않습니다. 암호화는 기밀성을 제공합니다. 아래 표에서 차이점을 명확히 설명합니다.

속성HMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

HMAC 알고리즘 비교

HMAC은 모든 해시 함수를 사용할 수 있지만, 기반 알고리즘 선택에 따라 출력 크기, 보안 수준, 브라우저 호환성이 결정됩니다. HMAC-SHA256이 새로운 시스템에서 가장 일반적인 선택입니다. 아래 표는 자주 접하게 될 변형들을 비교합니다.

알고리즘다이제스트 크기16진수 길이Web Crypto API최적 용도
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

HMAC의 내부 동작 원리

HMAC은 두 가지 서로 다른 키 파생 패드를 사용하여 기반 해시 함수를 두 번 적용합니다. 이 구조는 RFC 2104에 정의되어 있으며 표준 암호학적 가정 하에서 PRF(의사 난수 함수)임이 증명되었습니다. 키는 먼저 패딩되거나 해시되어 해시 함수의 블록 크기(SHA-256은 64바이트, SHA-512는 128바이트)에 맞춰집니다.

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
where K' = key padded to block size, ipad = 0x36, opad = 0x5C

알고리즘은 패딩된 키를 내부 패드 상수(ipad, 0x36 반복)와 XOR하고, 메시지와 연결한 후 결과를 해싱합니다. 그런 다음 패딩된 키를 외부 패드 상수(opad, 0x5C 반복)와 XOR하고, 내부 해시 출력과 연결한 후 다시 해싱합니다. 이 이중 해싱 구조가 길이 확장 공격을 방지하고 비밀 키를 알지 못하면 HMAC 출력을 계산할 수 없도록 보장합니다.

HMAC 코드 예제

HMAC은 모든 주요 언어와 런타임에서 네이티브로 지원됩니다. Web Crypto API는 라이브러리 없이 브라우저에서 HMAC-SHA256, HMAC-SHA384, HMAC-SHA512를 제공합니다. 아래 예제는 웹훅 검증과 상수 시간 비교를 포함한 실제 사용 패턴을 보여줍니다.

JavaScript (Web Crypto API)
async function hmacSHA256(message, secret) {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
  return Array.from(new Uint8Array(sig))
    .map(b => b.toString(16).padStart(2, '0')).join('')
}

await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
  .update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
Python
import hmac
import hashlib

# HMAC-SHA256
sig = hmac.new(
    b'my-secret-key',
    b'hello world',
    hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
    print("Signature valid")

# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()
Go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "fmt"
)

func main() {
    mac := hmac.New(sha256.New, []byte("my-secret-key"))
    mac.Write([]byte("hello world"))
    sig := mac.Sum(nil)
    fmt.Printf("%x\n", sig)
    // → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

    // Verify: use hmac.Equal for constant-time comparison
    expected := mac.Sum(nil)
    fmt.Println(hmac.Equal(sig, expected)) // true
}
CLI (OpenSSL)
# HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key"
# → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

# HMAC-SHA512
echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key"

# Verify a file signature
openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz

# HMAC with hex key (e.g. from a webhook secret)
echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"

자주 묻는 질문

HMAC과 일반 해시의 차이점은 무엇인가요?
일반 해시(SHA-256, MD5)는 메시지만을 입력으로 받아 누구나 계산할 수 있는 다이제스트를 생성합니다. HMAC은 메시지와 비밀 키를 모두 받아 키를 가진 사람만 생성하거나 검증할 수 있는 서명을 생성합니다. 즉, HMAC은 무결성 확인에 더해 인증(발신자 신원 증명)을 제공합니다. 일반 해시는 데이터가 변경되지 않았음을 증명할 뿐, 누가 생성했는지는 증명하지 못합니다.
HMAC-SHA256은 안전한가요?
네. HMAC-SHA256은 2026년 현재 안전한 것으로 간주됩니다. 보안은 SHA-256의 의사 난수 특성과 HMAC 구조 자체(RFC 2104)에 의존합니다. HMAC-SHA256에 대한 실제적인 공격은 아직 발견되지 않았습니다. HMAC의 보안은 기반 해시의 완전한 충돌 저항성을 요구하지 않기 때문에 HMAC-MD5와 HMAC-SHA1도 실제로는 여전히 안전하지만, 새로운 시스템에는 SHA-2 변형을 권장합니다.
웹훅은 페이로드를 암호화하는 대신 HMAC을 사용하는 이유는 무엇인가요?
웹훅 페이로드는 수신자가 이미 예상하는 데이터(주문 세부 정보, 이벤트 알림, 상태 업데이트)를 포함하는 경우가 많습니다. 목표는 데이터를 숨기는 것(기밀성)이 아니라, 합법적인 발신자로부터 왔으며 전송 중 수정되지 않았음을 증명하는 것(진위성과 무결성)입니다. HMAC은 최소한의 오버헤드로 이를 달성합니다. 발신자는 공유 시크릿으로 페이로드의 HMAC을 계산하여 HTTP 헤더에 포함하고, 수신자는 HMAC을 재계산하여 비교합니다. 암호화는 불필요한 복잡성과 키 관리 부담을 추가할 것입니다.
HMAC 서명을 안전하게 비교하려면 어떻게 해야 하나요?
항상 상수 시간 비교 함수를 사용하세요. Python에서는 hmac.compare_digest()를, Node.js에서는 crypto.timingSafeEqual()을, Go에서는 hmac.Equal()을 사용하세요. 일반 문자열 동등 연산자(== 또는 ===)는 타이밍 정보를 누출할 수 있습니다. 공격자는 비교에 걸리는 시간을 측정하여 위조 서명의 몇 바이트가 올바른 것과 일치하는지 파악한 다음, 나머지 바이트를 하나씩 무차별 대입할 수 있습니다.
HMAC을 역산하여 비밀 키를 복구할 수 있나요?
아니요. HMAC은 단방향 해시 함수를 기반으로 하므로 HMAC 출력에서 키를 추출하는 수학적 지름길이 없습니다. 공격자는 키 공간을 무차별 대입해야 하는데, 128비트 이상의 키에서는 불가능합니다. 그러나 짧거나 약한 키(단순 비밀번호 등)는 사전 공격에 취약할 수 있으므로, HMAC-SHA256에는 항상 최소 256비트의 암호학적으로 안전한 무작위 키를 사용하세요.
HMAC 키가 해시 블록 크기보다 긴 경우 어떻게 되나요?
비밀 키가 해시 함수의 블록 크기(SHA-256은 64바이트, SHA-512는 128바이트)보다 긴 경우, HMAC 알고리즘은 먼저 기반 해시 함수로 키를 해싱하여 해시 출력 길이로 줄인 다음, 그 해시를 유효 키로 사용합니다. 즉, 매우 긴 키는 해시 출력 크기를 넘어서는 추가 보안을 제공하지 않습니다. HMAC-SHA256의 경우, 64바이트보다 긴 키는 32바이트로 해싱되어 64바이트 키보다 보안이 향상되지 않으며, 64바이트까지의 키는 전체 길이 그대로 사용됩니다.
HMAC-SHA256 대신 HMAC-SHA512를 언제 사용해야 하나요?
프로토콜이 요구할 때(HKDF-SHA512, Ed25519 키 생성 같은 일부 키 파생 함수), 심층 방어를 위해 더 넓은 서명이 필요할 때, 또는 SHA-512가 SHA-256보다 실제로 빠른 64비트 하드웨어에서 실행할 때 HMAC-SHA512를 사용하세요. 대부분의 웹 애플리케이션, API 서명, 웹훅 검증에서는 HMAC-SHA256이 충분한 보안을 제공하며 생태계 전반에서 더 일반적인 선택입니다.