HMAC 생성기 rfc 2104
비밀 키와 메시지로 HMAC-SHA256, SHA-512, SHA-1, MD5 서명 값을 생성합니다. 웹훅 검증과 API 서명에 사용합니다.
이 도구가 하는 일
HMAC은 해시 함수에 비밀 키를 결합해 메시지 인증 코드를 만드는 방식입니다. 이름은 Hash-based Message Authentication Code의 약자이며 RFC 2104로 표준화되어 있습니다.
일반 해시만으로는 메시지 인증이 되지 않습니다. 누구나 해시를 계산할 수 있으므로, 공격자가 메시지를 바꾸고 그에 맞는 해시를 다시 계산해 붙이면 그만이기 때문입니다. HMAC은 송신자와 수신자만 아는 비밀 키를 계산에 포함시켜 이 문제를 해결합니다. 키를 모르면 올바른 HMAC 값을 만들 수 없으므로, 값이 일치한다는 것은 메시지가 변조되지 않았고 키를 가진 쪽이 보냈다는 뜻이 됩니다.
내부적으로는 키를 블록 크기에 맞춘 뒤 두 개의 서로 다른 패딩과 결합해 해시를 두 번 적용하는 구조입니다. 이 이중 구조 덕분에 길이 확장 공격에 안전합니다. 이 도구는 crypto-js로 브라우저에서 계산하며 키와 메시지를 서버로 보내지 않습니다.
언제 사용하나요
결제사나 깃허브 같은 서비스가 보낸 웹훅의 서명 헤더가 맞는지 직접 계산해 확인할 때, API 요청 서명 로직을 구현하면서 기대값과 비교할 때, 다른 언어로 작성한 서명 코드가 올바른 값을 내는지 검증할 때, 문서에 나온 서명 예시를 재현해 볼 때 사용합니다.
입력과 출력 예시
메시지 hello / 키 my-secret-key / HMAC-SHA256
3ac7fc22f5cbd1aaaea11fac013d3e6f5d894fe2fc51ab98b6d3b1593a45255a
키가 한 글자만 달라도 결과가 전혀 달라집니다.
같은 입력, 출력 형식 base64
Osf8IvXL0aquoR+sAT0+b12JT+L8UauYttOxWTpFJVo=
같은 값을 16진수 대신 base64로 표현한 것입니다. 서비스마다 요구하는 형식이 다릅니다.
주의사항
운영 환경의 실제 비밀 키를 아무 곳에나 입력하지 마십시오. 이 도구는 브라우저에서만 계산하지만, 키가 유출되면 누구나 유효한 서명을 만들 수 있으므로 취급에 주의해야 합니다. 서명을 검증할 때는 문자열을 단순 비교하지 말고 실행 시간이 일정한 비교 함수를 사용해야 합니다. 비교 시간의 미세한 차이로 값을 알아내는 타이밍 공격이 가능하기 때문입니다. PHP의 hash_equals, Node.js의 crypto.timingSafeEqual이 그런 함수입니다. 알고리즘은 SHA-256 이상을 권장하며 HMAC-MD5는 레거시 호환 목적으로만 사용하십시오.
자주 묻는 질문
해시와 HMAC은 무엇이 다른가요?
해시는 키가 없어 누구나 계산할 수 있지만, HMAC은 비밀 키가 있어야 올바른 값을 만들 수 있습니다. 그래서 HMAC만이 메시지를 보낸 주체를 인증할 수 있습니다.
웹훅 서명이 계속 맞지 않습니다.
서명 대상이 무엇인지 확인하십시오. 서비스마다 원본 요청 본문 전체를 쓰기도 하고 타임스탬프를 앞에 붙이기도 합니다. 본문을 파싱한 뒤 다시 직렬화하면 공백 하나 차이로 값이 달라집니다.
어떤 알고리즘을 골라야 하나요?
새로 만드는 시스템이라면 HMAC-SHA256이 표준적인 선택입니다. SHA-1과 MD5 기반은 기존 시스템과의 호환이 필요할 때만 사용하십시오.