HMAC 생성기/검증기
HMAC-SHA256/SHA512 서명을 생성하고 검증합니다. API 인증, 웹훅 시그니처 검증에 유용합니다.
랜덤 키 생성
HMAC 생성기 — RFC 2104 기반 메시지 인증
HMAC(Hash-based Message Authentication Code)은 RFC 2104에 정의된 메시지 인증 코드 알고리즘입니다. 해시 함수(SHA-256, SHA-512 등)와 비밀 키를 결합하여 메시지의 무결성(integrity)과 인증(authenticity)을 동시에 보장합니다. 일반 해시와 달리 키를 모르면 동일한 HMAC을 생성할 수 없어, API 서명, 웹훅 검증, JWT HS256 서명 등 현대 웹 보안의 핵심 메커니즘으로 사용됩니다. 이 도구는 Web Crypto API로 브라우저 내에서 HMAC을 계산하며 키와 데이터는 서버로 전송되지 않습니다.
HMAC 동작 원리 — RFC 2104
HMAC의 계산 공식은 HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m))입니다. 여기서 K'는 블록 크기에 맞게 패딩된 키, opad는 0x5c 바이트 반복, ipad는 0x36 바이트 반복입니다. 이중 해싱 구조 덕분에 length-extension 공격에 안전하며, 해시 함수의 충돌 저항성이 일부 약해져도 HMAC 자체의 안전성은 유지됩니다.
GitHub Webhook 검증 (Node.js)
const crypto = require('crypto');
function verifyGitHubWebhook(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret);
const digest = 'sha256=' + hmac.update(payload).digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature), Buffer.from(digest)
);
}AWS Signature V4 — 다단계 HMAC 체인
function getSignatureKey(key, dateStamp, region, service) {
const kDate = hmacSHA256('AWS4' + key, dateStamp);
const kRegion = hmacSHA256(kDate, region);
const kService = hmacSHA256(kRegion, service);
return hmacSHA256(kService, 'aws4_request');
}
// 최종: HMAC-SHA256(signingKey, stringToSign)Stripe Webhook 타임스탬프 검증
// Stripe-Signature 헤더: t=timestamp,v1=signature
const signedPayload = timestamp + '.' + rawBody;
const expected = crypto
.createHmac('sha256', endpointSecret)
.update(signedPayload)
.digest('hex');
// 타이밍 안전 비교 필수!
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));알고리즘별 출력 길이와 권장 용도
| 알고리즘 | 출력(비트) | 권장 용도 |
|---|---|---|
| HMAC-SHA256 | 256 | Webhook, JWT HS256, API 서명 (범용 표준) |
| HMAC-SHA384 | 384 | TLS 1.3 PRF, 높은 안전 마진 |
| HMAC-SHA512 | 512 | JWT HS512, 장기 서명 보관 |
| HMAC-SHA1 | 160 | 레거시 전용 — 신규 구현 비권장 |
인프라 규모별 HMAC 운영 전략
소규모: 환경변수에 시크릿 키를 저장하고 단일 HMAC-SHA256 키로 서명합니다.중규모: AWS Secrets Manager 또는 Vault에 키를 보관하고, 서비스별 시크릿을 분리합니다. 키 로테이션 시 구/신 키를 동시에 검증하는 grace period를 설정하세요.대규모: 각 서비스 인스턴스에 서로 다른 키를 할당하고, 중앙 키 관리 서비스에서 자동 로테이션을 수행합니다. 모든 검증 실패는 SIEM에 기록합니다.
보안 베스트 프랙티스
- HMAC 키 길이는 해시 함수 출력 길이 이상으로 설정하세요 — SHA-256이면 최소 32바이트.
- 서명 비교 시 반드시
timingSafeEqual(상수 시간 비교)을 사용하세요 — 단순 문자열 비교는 타이밍 공격에 취약합니다. - HMAC-SHA1은 신규 시스템에 사용하지 마세요 — 레거시 호환에만 한정하세요.
- Webhook 수신 시 타임스탬프 허용 범위를 5분 이내로 제한하여 재전송 공격(replay attack)을 방지하세요.
관련 도구
데이터 암호화가 필요하면 AES 암호화 도구를, 비대칭 서명에는 RSA 키 생성기를, API 요청 테스트에는 cURL 변환기를 활용하세요.
참고 자료
- RFC 2104 — HMAC: Keyed-Hashing for Message Authentication
- NIST FIPS 198-1 — The Keyed-Hash Message Authentication Code
- AWS Signature Version 4 Signing Process (AWS 공식 문서)
- OWASP Authentication Cheat Sheet