T도구모음

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-SHA256256Webhook, JWT HS256, API 서명 (범용 표준)
HMAC-SHA384384TLS 1.3 PRF, 높은 안전 마진
HMAC-SHA512512JWT HS512, 장기 서명 보관
HMAC-SHA1160레거시 전용 — 신규 구현 비권장

인프라 규모별 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

자주 묻는 질문

관련 도구