HS256

최준병·5일 전

HS256

HMAC + SHA-256 을 의미하는 서명 알고리즘
SHA-256을 사용하여 HMAC한 서명 알고리즘

서명 과정

서명 = HMAC-SHA256(
  Base64url(Header) + "." + Base64url(Payload),
  비밀키(Secret Key)
)

검증 과정

받은 토큰의 서명 == 서버가 직접 계산한 서명?
  → 같으면: 유효한 토큰 ✅
  → 다르면: 위변조된 토큰 ❌

HMAC이 필요한 이유

단순히, SHA-256만으로 서명을 하면 payload가 조작된 것을 감지할 수 없음.

서명 = SHA256("header.payload") 

탈취된 토큰의 payload를 위조하여, 재서명하여도 조작된것을 검증 할 수 없음.
재서명 = SHA256(header.변경된payload)

HMAC

Hash-based Message Authentication Code 의 줄임말로 키를 받아 해시값을 만들어내는 방식을 말한다.

HMAC 동작방식

HMAC(K, M) = SHA256(
                (K ⊕ opad) +           ← 바깥 패딩과 키를 XOR
                SHA256(
                  (K ⊕ ipad) + M       ← 안쪽 패딩과 키를 XOR한 뒤 메시지 붙이기
                )
             )
  • K : 비밀키
  • M : 서명할 메시지 (header.payload)
  • ipad : 0x36(6) 반복 (inner padding)
  • opad : 0x5C(\) 반복 (outer padding)

패딩은 key의 길이만큼 반복하여 생성한다.

key가 5글자라면, 바깥 패딩은 "66666" 이 된다.

같은 키를 그대로 두 번 쓰면 내부/외부 해시가 너무 비슷한 구조가 되어서 수학적 취약점이 생기기때문에,
key를 패딩과 XOR연산하여 한번 더 꼬아주는게 핵심이다.

길이 확장 공격 (Length Extension Attack)

SHA-256은 Merkle-Damgård 구조로, 최종 해시값이 곧 마지막 내부 상태값이다.
따라서 SHA256(K + M)의 결과를 알면, K를 모르더라도
SHA256(K + M + 추가데이터)를 계산할 수 있다.

HMAC은 내부 해시값을 외부 SHA256의 입력으로 한번 더 감싸기 때문에
공격자가 내부 상태를 이어서 계산할 수 있는 접점 자체가 사라진다.

같은 키를 두 번 쓰면 안 되는 이유

내부/외부 해시에 동일한 키가 반복되면, 여러 서명값을 수집했을 때
두 해시 계산 사이의 수학적 관계를 추론할 수 있게 된다.
ipad/opad로 키를 XOR 변형하면, 내부/외부가 수학적으로
독립된 키를 쓰는 것과 같은 효과가 나서 이 관계를 끊어낼 수 있다.

profile
나의 기록

0개의 댓글