HMAC-SHA256 생성기 쉽게 이해하기 — 개념과 원리
HMAC-SHA256은 비밀 키와 메시지를 함께 넣어 256비트 인증 태그를 만드는 메시지 인증 코드입니다. 키를 가진 사람만 태그를 만들고 검증할 수 있습니다. 이 도구는 브라우저 안에서 태그를 계산하며, HMAC은 API 요청과 웹훅 서명, HS256 방식의 JWT, 쿠키나 메시지 위변조 확인에 쓰입니다.
계산 방법
HMAC(K, m) = H((K′ ⊕ opad) ∥ H((K′ ⊕ ipad) ∥ m)) (RFC 2104)
- H는 SHA-256이며 블록 크기는 64바이트입니다.
- K′는 키 뒤에 0을 채워 64바이트로 만든 값입니다. 64바이트보다 긴 키는 먼저 해시해 32바이트로 줄입니다.
- ipad는 0x36을 64번, opad는 0x5c를 64번 반복한 값이고, ⊕는 XOR, ∥는 이어 붙이기입니다.
- 키와 메시지는 UTF-8 바이트로 처리하고, 결과는 16진수 64자리로 표시합니다.
원리
SHA-256으로 단순히 '키 ∥ 메시지'를 해시하면 안전하지 않습니다. 머클-담고르 구조 때문에 공격자가 키 없이도 메시지 뒤에 내용을 덧붙이고 올바른 해시를 계산할 수 있기 때문입니다(길이 확장 공격). HMAC은 서로 다른 두 파생 키로 해시를 두 번 감싸고, 바깥 해시가 안쪽 상태를 감추어 이 공격을 막습니다. 안전성은 해시 압축 함수의 의사난수성에 기대도록 증명되어 있습니다.
예제 풀이
- 키 "secret"(6바이트) 뒤에 0을 58바이트 채워 64바이트로 만듭니다.
- 안쪽: 키를 0x36과 XOR하고 "The quick brown fox"의 UTF-8 바이트를 붙여 SHA-256을 계산합니다.
- 바깥쪽: 키를 0x5c와 XOR하고 안쪽 결과 32바이트를 붙여 다시 해시합니다.
- 결과: 7a284e5025f32a846fa3e6957d10278eb5726dd4e0b04c8e0259defcd2cd0eb1
결과 해석
받는 쪽은 같은 키로 태그를 다시 계산해 정확히 일치할 때만 메시지를 받아들입니다. 키나 메시지가 한 글자, 대소문자 하나만 달라도 태그는 완전히 달라집니다. 일부 API는 16진수 대신 Base64로 표시하지만 바이트는 같습니다.
흔한 실수
- 일반 문자열 비교로 태그를 비교하는 경우. 시간 차 공격을 막으려면 상수 시간 비교를 써야 합니다.
- 짧고 추측하기 쉬운 키를 쓰는 경우
- 받는 쪽과 다른 형태의 바이트를 서명하는 경우(공백, JSON 순서, 줄바꿈 차이)
자주 묻는 질문
HMAC은 암호화인가요?
아닙니다. 메시지가 바뀌지 않았음을 증명하는 태그일 뿐, 메시지는 누구나 읽을 수 있습니다.
키는 얼마나 길어야 하나요?
RFC 2104는 해시 출력 길이 이상을 권장하므로 SHA-256이라면 32바이트 이상이 좋습니다.
다른 도구와 결과가 다른 이유는 무엇인가요?
키 형식(텍스트·16진수·Base64), 끝의 줄바꿈, 출력 형식을 확인해 보시기 바랍니다.
출처: RFC 2104, HMAC: Keyed-Hashing for Message Authentication · NIST FIPS 198-1, The Keyed-Hash Message Authentication Code (HMAC)