brunch

You can make anything
by writing

C.S.Lewis

by 테크유람 Mar 28. 2021

해싱(Hashing)을 활용한 HMAC

Hash based Message Authentication Code

송수신자 간의 메시지를 주고받을 때, 메시지가 변조되었는지를 확인할 필요가 있습니다. 원본 메시지와, 전달된 메시지를 비교하여 변조 여부를 확인하는 방식이 MAC(Message Authentication Code)입니다.


해싱과 공유키를 사용한 MAC 기술이 바로 HMAC

HMAC(Hash based Message Authentication Code)은 RFC2104로 발표된 MAC 기술의 일종으로,

원본 메시지가 변하면 그 해시값도 변하는 해싱(Hashing)의 특징을 활용하여 메시지의 변조 여부를 확인(인증) 하여 무결성과 기밀성을 제공하는 기술입니다.


일반 해싱 알고리즘과 HMAC의 공통점은 해싱 알고리즘이 적용된 해싱 함수를 사용한다는 것이고,

가장 큰 차이는, HMAC은 해시 암호 키를 송신자와 수신자가 미리 나눠가지고 이를 사용한다는 것입니다.

송수신 자만 공유하고 있는 키와 원본 메시지를 혼합하여 해시값을 만들고 이를 비교하는 방식입니다.

HMAC = Hash(Message, Key) + Message
※ Hash( ) 함수는 SHA1, SHA2, MD5 등의 알고리즘 사용

해시 함수에 사용하는 해시 알고리즘에 MD5, SHA 등을 사용하며, 사용 알고리즘에 따라 HMAC-MD5, HMAC-SHA1, HMAC-SHA2-256 등으로 나누어집니다.


송신자-수신자 간의 HMAC 플로우

HMAC을 사용한 메시지 무결성의 전반적인 프로세스는 다음과 같습니다.

<HMAC을 사용한 메시지 무결성의 전반적인 프로세스>


위 그림을 순서대로 설명해보겠습니다.

1. 송신자와 수신자 사이에 암호화 채널을 사용하여 해싱에 사용할 키(key)를 공유합니다. 
☞ 양쪽이 동일한 key를 사용하니, 대칭키(symmetric key) 방식이라 할 수 있습니다.

2. 송신자는 key를 사용하여 원본 메시지를 해싱합니다. 해싱된 메시지가 바로 MAC입니다.

3. 송신자는 원본 메시지와 그것의 해싱 메시지(MAC)를 수신자에 전달합니다.

4. 수신자는 key를 사용하여 원본 메시지를 해싱하고, 송신자에게 받은 MAC과 비교합니다.

5. 비교한 값이 동일하다면, 원본 메시지는 변조되지 않았고 신뢰할 수 있는 값으로 판단합니다.

6. 만약 해커가 메시지를 변조했다면, 수신자의 MAC과 송신자의 MAC 값이 다른 것을 확인할 수 있습니다.


얼핏 보면, 누군가 엿볼 수 있는 원본 메시지를 그대로 보내는 것이 의아하게 보일 수 있습니다만 해싱은 암호화가 아닌, 무결성을 확인하는 기술이라는 것을 다시 한번 상기해야 합니다. 실제로 암호화와 해싱을 모두 수행하기 위해 HTTPS와 같은 보안 채널을 통해 원본 메시지를 보호하고, MAC과 같이 전달하는 것이 일반적입니다.


Replay Attack에 대한 방어

공격자는 메시지를 변조할 수 없으니, HMAC을 그대로 사용하여 수신자에게 불필요한 호출을  여러 번 공격성으로 보낼 수 있습니다. 이런 공격을 Replay Attack이라고 합니다. 이 공격을 방지하기 위해서는 HMAC과 함께 송신자의 송신 시간에 해당하는 타임스탬프(timestamp) 값을 찍어 보내어, 특정 시간이 지난 후에 메시지 자체가 무효화될 수 있는 로직을 사용하기도 합니다.


지금까지 설명은 원본 메시지를 전달하는 경우의 무결성을 위한 HMAC의 예를 들었지만, 실제로는 HMAC을 단순히 메시지 무결성을 확인하는 경우보다 REST API의 URL 경로에 API Key와 HMAC을 함께 보내어 API 서버가 변조되지 않은 API 호출임을 검증하거나, HMAC으로 만든 인증 코드를 통해 서버에 로그인하는 등의 시나리오에 사용합니다.




브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari