HMAC 생성기

HMAC는 대부분의 서명된 웹훅, AWS Signature v4 헤더, 그리고 JWT HS256 토큰의 기반이 되는 알고리즘입니다. 메시지와 비밀 키를 입력하고 해시 계열을 선택하면 이 생성기는 RFC 2104에서 규정한 대로 정확한 HMAC 값을 생성합니다. 이는 백엔드가 전송하려는 데이터를 검증하거나 API로부터 수신한 서명을 재현하는 데 유용합니다.

HMAC을 계산하는 방법

  1. 1

    메시지를 붙여넣으세요

    서명할 정확한 바이트, 웹훅 페이로드, 정규화된 요청, 또는 임의의 문자열입니다.

  2. 2

    비밀 키를 입력하세요

    텍스트 또는 16진수 형식일 수 있습니다. 생성기는 RFC 규정에 따라 키를 블록 크기에 맞게 패딩하거나 해시 처리합니다.

  3. 3

    해시 알고리즘을 선택하세요

    기본값은 SHA-256이며, 기존 시스템과의 호환성이 필요한 경우 SHA-1, SHA-384, SHA-512 또는 MD5를 선택할 수 있습니다.

  4. 4

    서명을 복사하세요

    출력은 소문자 16진수 형식으로, 웹훅 설정이나 Authorization 헤더에 바로 붙여넣을 수 있습니다.

HMAC의 내부 원리

HMAC은 일반 해시 함수를 키 기반 구조로 감싸, 키가 없으면 서명을 위조할 수 없도록 합니다.

RFC 2104 레시피

HMAC(k, m) = H((k' ⊕ opad) ∥ H((k' ⊕ ipad) ∥ m))

여기서 k'는 해시 블록 크기에 맞게 패딩된 키이며, opad = 0x5c repeatedipad = 0x36 repeated는 패딩 상수입니다.

알고리즘 선택

알고리즘 블록 크기 출력 길이 권장 용도
HMAC-SHA-256 64바이트 32바이트 현대적 기본값, 웹훅 서명
HMAC-SHA-384 128바이트 48바이트 높은 보안이 필요한 API 서명
HMAC-SHA-512 128바이트 64바이트 장기 유효 토큰
HMAC-SHA-1 64바이트 20바이트 레거시 (AWS S3 v2, OAuth 1.0)
HMAC-MD5 64바이트 16바이트 레거시 전용; 새 작업에는 사용하지 마십시오

HMAC가 사용되는 곳

  • GitHub, Stripe, Shopify 웹훅: 헤더 X-Hub-Signature-256, Stripe-Signature 등.
  • AWS Signature v4: 정규화된 요청에 연쇄적으로 적용되는 HMAC-SHA256.
  • JWT HS256: 토큰 서명은 HMAC-SHA-256(header.payload, secret)입니다.
  • 비밀번호 재설정 토큰: user_id, 만료 시간, 사이트 비밀 값을 결합해 생성한 HMAC.

흔한 실수

  • 16진수로 인코딩된 키를 먼저 바이트로 디코딩하지 않고 문자열 형태로 전달하는 것.
  • 잘못된 페이로드 바이트에 서명하는 것: 일부 웹훅은 공백을 포함한 원시 요청 본문에 서명하고, 다른 웹훅은 정규화된 형식에 서명합니다.
  • 서명 비교에 JavaScript나 Python의 ==를 사용하는 것; 타이밍 공격을 막기 위해 항상 타이밍 세이프(timing-safe) 비교를 사용하세요.

자주 묻는 질문

거의 항상 메시지 바이트가 서로 다르기 때문입니다. JSON으로 파싱된 본문에 서명하면 공백 문자가 변경되므로, 원시 요청 본문에 직접 서명해야 합니다. 또한 양측에서 키가 동일한 방식(16진수 대 원시 바이트)으로 디코딩되는지 반드시 확인하세요.

네. 키가 해시 블록 크기보다 짧으면 0으로 패딩되고, 길면 먼저 해시 처리됩니다. RFC 2104는 키 길이가 출력 길이(SHA-256의 경우 32바이트) 이상이 되도록 권장합니다.

HMAC는 알려진 MD5 충돌 공격에도 여전히 안전한데, 해당 공격이 HMAC 구조에는 그대로 적용되지 않기 때문입니다. 그럼에도 불구하고 새 코드에는 HMAC-SHA-256을 사용하세요. 도구와 감사자 모두 이를 기대합니다.

네. HMAC을 계산하기 위해 메시지와 비밀 키가 암호화된 HTTPS 연결로 당사 서버에 전송됩니다. 계산에만 사용되며 저장되거나 기록되지 않습니다.

관련 도구

이 도구는 다른 언어로도 제공됩니다