HMAC 생성기
비밀 키로 메시지에 서명합니다. 아무것도 전송되지 않습니다.
- 브라우저에서 실행됩니다 — 입력한 텍스트는 어디로도 전송되지 않습니다
- 가입 불필요, 사용량 제한 없음, 원하는 만큼 무료로 사용
작동 방식
HMAC은 두 가지를 한꺼번에 증명합니다. 메시지가 변조되지 않았다는 것, 그리고 그것을 만든 쪽이 공유된 비밀을 가지고 있다는 것입니다. 웹 대부분에서 웹훅, API 요청, 다운로드 링크에 서명하는 데 쓰입니다.
일반 해시와 다른 점, 중요한 부분
누구나 메시지의 SHA-256을 계산할 수 있으므로 단순 해시는 누가 만들었는지에 대해 아무것도 증명하지 못합니다. 메시지를 바꾸고 해시를 다시 계산하면 아무도 알 수 없습니다. HMAC은 계산에 비밀 키를 섞으므로 키 없이는 다시 계산할 수 없습니다. 이것이 핵심이며, 웹훅 서명이 해시가 아니라 HMAC을 쓰는 이유입니다.
안전하게 검증하기
서버에서 HMAC을 확인할 때는 상수 시간 함수로 비교하세요. Node에서는 crypto.timingSafeEqual, PHP에서는 hash_equals입니다. 일반적인 ==는 두 바이트가 달라지는 즉시 반환하며, 걸린 시간이 서명이 얼마나 맞았는지를 드러내므로 끈기만 있으면 위조할 수 있습니다. 이론이 아니라 실제로 가능한 공격입니다.
어떤 알고리즘인가
다른 지정이 없으면 SHA-256을 쓰세요. 오래된 API 중에는 HMAC-SHA-1을 요구하는 곳이 많아 SHA-1을 포함했습니다. HMAC-SHA-1은 일반 SHA-1처럼 깨지지는 않았지만, 새로 만드는 것에 선택할 이유는 없습니다.
Hex 또는 Base64
전적으로 상대방이 기대하는 형식에 달려 있습니다. Hex는 두 배 길지만 읽기 쉽고, Base64는 더 간결하며 HTTP 헤더에서 흔합니다. 같은 서명이 두 형식으로 모두 표시됩니다.
키는 이곳에만 있습니다
브라우저 자체의 Web Crypto API로 생성합니다. 키와 메시지는 어디로도 전송되지 않으며, 이것이 이런 도구를 제공하는 유일하게 책임 있는 방식입니다. 비밀을 업로드하는 서명 도구는 그 비밀이 지켜 주는 바로 그것을 넘겨주는 셈입니다.
HMAC 생성기 — 자주 묻는 질문
HMAC은 해시와 어떻게 다른가요?
해시는 누구나 다시 계산할 수 있습니다. HMAC은 비밀 키가 필요하므로 누가 만들었는지 증명합니다.
어떤 알고리즘을 써야 하나요?
API가 다른 것을 지정하지 않는 한 SHA-256을 쓰세요. SHA-1은 아직 이를 요구하는 오래된 시스템을 위해 제공합니다.
hex와 Base64 중 무엇을 써야 하나요?
상대방이 기대하는 쪽을 쓰세요. 같은 서명이 두 형식으로 모두 표시됩니다.
비교는 왜 상수 시간이어야 하나요?
일반적인 비교는 처음 불일치하는 지점에서 바로 끝나는데, 그 시간 차이가 얼마나 맞았는지를 드러내며 서명을 위조하기에 충분합니다.
내 비밀 키가 어딘가로 전송되나요?
아니요. 모든 것이 브라우저에서 Web Crypto API로 실행됩니다.