HMAC
HMAC(Hierarchical Message Authentication Code)은 키를 활용한 메시지 인증 방식으로, 메시지 무결성을 보호하는 데 사용됩니다.
HMAC은 일반적으로 대칭키를 사용하며, 주어진 입력 메시지와 키를 이용하여 MAC(Message Authentication Code)을 생성합니다.
HMAC은 다음과 같은 구성 요소를 사용하여 MAC을 생성합니다.
- 해시 함수 (Hash function) : SHA-1, SHA-256 등과 같은 해시 함수를 사용합니다.
- 내부 패딩 (Inner padding) : 0x36과 같은 내부 패딩 값을 사용하여 해시 함수를 적용하기 전 입력 메시지를 처리합니다.
- 외부 패딩 (Outer padding) : 0x5C와 같은 외부 패딩 값을 사용하여 내부 패딩값과 해시 결과를 결합하여 MAC을 생성합니다.
HMAC의 정의는 다음과 같습니다.
- HMAC(K, M) = H[(K ⊕ opad) || H[(K ⊕ ipad) || M]]
여기서,
- K : 사용되는 대칭키
- M : 입력 메시지
- H : 사용되는 해시 함수
- ⊕ : 비트 단위 XOR 연산
- opad : 0x5C로 구성된 외부 패딩 값
- ipad : 0x36로 구성된 내부 패딩 값
따라서 HMAC은 입력 메시지 M과 K를 결합하고, 내부 패딩 값(ipad)을 XOR 연산하여 해시 함수(H)에 적용한 결과값에 외부 패딩 값(opad)을 XOR 연산하여 다시 해시 함수에 적용한 결과값을 생성합니다.
이렇게 생성된 MAC 값은 메시지의 무결성을 보호하기 위해 사용됩니다.
설계 목표
- 수정하지 않고 쓸 수 있는 해시 함수를 만든다
- HMAC은 이미 존재하는 해시 함수와 결합되어 사용될 수 있습니다.
- 따라서, HMAC은 기존의 해시 함수를 수정하지 않고 그대로 사용할 수 있습니다.
- 더 좋은 해시 함수가 등장하면, 교체 할 수 있어야 한다
- HMAC은 내부적으로 해시 함수를 사용하므로, 더 좋은 해시 함수가 개발되면 그것으로 교체할 수 있도록 설계되었습니다.
- 심각한 기능 저하를 유발하지 않고, 해시 함수의 원래 성능을 유지하도록 한다
- HMAC은 해시 함수에 추가적인 계산을 수행하지만, 이로 인해 해시 함수의 성능이 심각하게 저하되지 않도록 설계되었습니다.
- 키를 보다 쉽게 다루고자 한다
- HMAC은 키를 사용하여 메시지 인증코드를 생성합니다.
- 이 키는 보다 쉽게 다룰 수 있도록 설계되었습니다.
- 내장된 해시 함수에 대해 합리적인 가정을 했을 때, 인증 메커니즘의 강도에 대해 암호 해독을 확실히 할 수 있다
- HMAC은 내장된 해시 함수에 대한 합리적인 가정을 바탕으로, 메시지 인증코드의 강도를 보장합니다. 이는 암호 해독을 통해 확인됩니다.
설계 목표의 핵심은 1번과 2번입니다.
HMAC은 해시 함수를 블랙 박스로 간주합니다.
즉 해시 함수를 모듈로 여겨 해시 함수를 상황에 따라 유연하게 변경 할 수 있습니다.
HMAC 생성 방법
HMAC 생성 방법은 다음과 같습니다:
- 사용하고자 하는 해시 함수를 선택합니다. (예: SHA-256)
- 인증 키와 내부 패딩 값으로 구성된 내부 키를 생성합니다. 내부 키는 공개되지 않아야 하며, 인증 키와 무작위 바이트 값을 사용하여 생성됩니다.
- 입력 메시지를 내부 패딩 값과 함께 해시 함수에 입력합니다.
- 내부 키를 사용하여 내부 패딩 값의 해시를 계산합니다.
- 입력 메시지와 내부 패딩 값의 해시 값을 이용하여 인증 키로 HMAC을 계산합니다.
- 계산된 HMAC 값을 사용하여 메시지 인증을 수행합니다.
HMAC은 대칭키 암호화 방식으로, 인증 키를 공유하는 모든 사용자가 같은 HMAC을 계산할 수 있습니다.
따라서 메시지의 무결성을 검증하기 위해 수신자는 전송된 메시지와 함께 수신된 HMAC 값을 이용하여 새로운 HMAC 값을 계산하고, 계산된 HMAC 값이 수신된 HMAC 값과 일치하는지 확인합니다.
일치하지 않는 경우, 메시지가 위변조 되었다는 것을 의미하며, 인증이 실패한 것입니다.
HMAC 생성 - 심화
HMAC 생성 방법에서 M을 비밀키(K)와 함께 해시 함수에 입력하여 생성된 값을 사용합니다.
즉, HMAC의 해시 함수 입력 값은 H(K ⊕ opad) || H((K ⊕ ipad) || M) 입니다.
여기서 opad는 outer padding, ipad는 inner padding을 나타내며, H는 해시 함수를 의미합니다.
그리고 생성된 HMAC 코드는 보통 인증 메시지와 함께 전송됩니다. 인증 메시지에 대해서는 MAC(MAC와 함께 전송된 M)를 계산하여 인증이 되었는지 확인합니다.
HMAC 생성 과정을 다시 식으로 나타내면 다음과 같습니다.
- 사용자가 입력한 키 K와 메시지 M을 이진수(binary)로 변환합니다.
- K의 길이를 B바이트(Byte)로 제한합니다.
- 만약 K의 길이가 B보다 크면, K를 해시 함수로 압축합니다.
- 예를 들어 SHA-1을 사용하는 경우, K를 SHA-1 해시 함수로 압축할 수 있습니다.
- B바이트 길이의 내부 키 값을 생성합니다.
- 이때, K를 B바이트 길이로 만든 후, K의 끝에 0으로 채워진 B바이트 값을 붙입니다.
- 예를 들어, B가 64바이트이고, K의 길이가 16바이트라면, K의 끝에 48바이트의 0값을 붙입니다.
- 이때, ipad와 opad 값을 사용하여 내부 키 값을 생성합니다.
- 예를 들어, ipad는 0x36, opad는 0x5c 값을 사용합니다.
- 내부 키 값을 사용하여 두 개의 다른 해시 값 H1, H2를 생성합니다.
- H1은 내부 키 값과 M을 연결한 것을 해시 함수에 입력한 결과입니다.
- H2는 내부 키 값과 H1을 연결한 것을 해시 함수에 입력한 결과입니다.
- H2 값을 외부 키 값으로 사용하여 다시 한번 해시를 수행한 후, 이 값을 HMAC으로 사용합니다. 이때, opad 값을 사용하여 외부 키 값을 생성합니다.
HMAC에서 XOR 연산을 하는 이유
HMAC에서는 inner key와 outer key를 XOR 연산을 통해 합칩니다.
이는 강력한 보안성을 제공하기 위한 것입니다.
만약 inner key와 outer key를 그대로 연결하여 사용하면, 이중 하나의 키가 유출되면 다른 하나의 키도 쉽게 추측될 수 있습니다.
하지만 XOR 연산을 통해 두 키를 결합하면, 두 키 중 하나가 노출되어도 다른 하나를 추측하기가 어려워집니다. 따라서,
HMAC에서는 XOR 연산을 사용하여 inner key와 outer key를 결합하고, 이를 해시 함수의 입력으로 사용하여 MAC을 생성합니다.
레퍼런스
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'Computer Science > Security' 카테고리의 다른 글
공개 키 (0) | 2023.04.05 |
---|---|
블록 암호 기반 MAC(CMAC) (0) | 2023.04.04 |
메시지 다이제스트 (0) | 2023.04.03 |
SHA 안전 해시 함수는 무엇인가 (0) | 2023.04.03 |
단순 해시 함수 (0) | 2023.04.03 |