본문 바로가기
기타/CS

HMAC(Hash-based message authentication code)

by oneny 2023. 9. 9.

HMAC

HMAC(Hash-based message authentication code)는 해시 함수와 비밀키를 사용하는 암호화 인증 기술이다. 서명 및 비대칭 암호화와는 다르게 HMAC은 공유 암호를 사용하여 인증하고 데이터가 올바르고 신뢰할 수 있는지를 확인한다. 송신자와 수신자는 통신 시 서로 주고 받는 내용이 비공개이길 원한다. 또한 인터넷은 신뢰할 수 없는 매체이기 떄문에 수신된 패킷이 변조되었는지를 확인할 방법이 필요하다. 이러한 경우 HMAC은 효과적인 해결방법이 될 수 있다.

 

HMAC 이전에 MAC에 대해서 먼저 알아보자.

 

MAC

메시지에서부터 해시함수를 이용해 계산된 해시값을 Message Digest라고 부른는데 이 Message Digest에 인증 정차를 추가한 것을  메시지 인증 코드(Message Authentication Code)라고 한다. 쉽게 메시지 인증에 쓰이는 작은 코드의 정보라 생각하면 되고, 메시지의 무결성 및 인증을 보장하는 용도로 사용한다.

 

위 그림을 보면 송신자는 메시지 m에서 MAC을 계산하여, 메시지와 함께 MAC을 함께 보낸다. 수신자는 메시지와 MAC을 받았을 때 메시지를 사용자 A가 사용한 동일한 해시함수를 사용하여 그 결과값을 수신한 MAC과 비교하여 메시지가 변조되었는지 조사하여 메시지 무결성을 증명할 수 있다.

 

참고: Digest
Hash 함수를 통과하기 전의 원본 데이터를 메시지(message)라고 부르고, 통과된 이후의 데이터를 다이제스트(digest)라 부른다.

 

MAC의 특징

  • 메시지 무결성(Message Integrity)
    • 메시지가 변경되지 않았음을 증명, 즉 수신된 메시지는 송신한 메시지와 동일함을 증명한다.
    • 주의할 점으로 무결성은 변경되지 않았음을 증명하는 것이지 변경시키지 못하도록 하는 것은 아니다.
  • 메시지 인증(Message Authenication)
    • 메시지 송신자를 증명, 즉 메시지는 약속된 송신자가 보낸 것임을 증명한다.
    • 메시지 인증은 개체(사용자) 인증(entity(or user) authenication)과는 구별된다.

 

암호화로 대신 사용 가능할까?

메시지 무결성과메시지 인증을 보장하기 위해 암호화 알고리즘 중 대칭키 암호화를 사용할 수 있을까?

대칭키 암호화는 대칭키는 송신자와 수신자만 갖고 있기 때문에 메시지 인증은 제공하지만 보내는 과정에서 제3자가 메시지 내용을 바꾼다고 하더라도 수신자는 바뀐 내용대로 암호문을 복호화시키기 때문에 메시지 무결성은 제공해주지 못한다.

그러면 공개키 기반의 전자 서명을 하는 경우에는 메시지 무결성과 메시지 인증을 제공한다. 이에 대해서는 다른 블로그글을 참고하자.

 

해시함수와 MAC

해시함수의 주요 응용의 하나는 MAC을 계산하는데 사용하는 것이다. 해시함수를 이용하여 MAC을 계산하는 이점은 암호화 알고리즘을 사용하지 않아 빠른 계산이 가능하다는 장점이 있다. 하지만 메시지 암호화는 안된다는 단점이 있다.

그리고 단순한 해시함수(H(m))을 MAC으로 사용하는 것은 메시지 무결성을 보장하지 못한다. 메시지를 보내는 과정에서 제3자가 메시지를 바꿨다고 가정해보자. 어떤 해시 알고리즘을 사용한 해시함수인지를 알려져 있기 때문에 제3자가 사용자 A가 사용한 해시함수를 동일하게 사용한다면 사용자 B 입장에서는 이를 변조되지 않았다고 볼 수 있다.

그러면 어떻게 해야 MAC을 이용해서 메시지가 변경되지 않았다는 메시지 무결성을 증명할 수 있을까?

 

A keyed Hash for MAC

송신자와 수신자는 서로만이 알고 있는 공유하고 있는 비밀값이 있다. 해시를 사용하여 MAC을 계산할 때 메시지(m)와 비밀값(k)을 같이 입력으로 하여 계산(H(m, k))하면 메시지 무결성을 증명할 수 있다. 이러한 방법에 사용되는 해시함수를 keyed hash라고 한다.

 

위 그림을 보면 송신자가 메시지에 대해 해시함수를 통해 MAC을 계산할 때 메시지와 비밀값을 같이 입력하는 것을 볼 수 있다. 그러면 수신자도 메시지에 대해 동일한 해시함수를 통해 MAC을 계산할 때 공유된 비밀값을 입력하여 그 둘을 비교하여 위조가 되었는지를 검사하여 메시지 무결성을 증명할 수 있다. 그리고 송신자(사용자 A)와 수신자(사용자 B)만이 가지고 있는 비밀값을 가지고 있기 때문에 송신자를 인증할 수 있다.

 

HMAC

위키백과 - 메시지 인증 코드

이러한 HMAC은 실제 가장 널리 사용되고 있는 keyed hash algorithm으로 IPsec, SSL/TSL 등에 사용되고 있다. 1996년에 RFC 2104로 지정되어 keyed hash의 구체적인 표준으로 HMAC이다. 실제로는 이중 해시(H(K|| H(K||x)) where K: secret key, x: message)를 사용한다.

 

HMAC 구성

HMAC 키는 아래처럼 두 부분으로 구성된다.

  1. Cryptographic keys: 암호화 알고리즘은 데이터를 변경시키며, 수신자는 데이터를 다시 읽기 위해 특정 코드(key)가 필요하다. HMAC은 공유된 비밀키 세트에 의존한다.
  2. Hash function: 해시 알고리즘은 메시지를 한 번 더 변경시키거나 요약한다. HMAC은 SHA-1, MD5, RIPEMD-128/60과 같은 일반 암호화 해시 함수를 사용한다.

 

이 시스템을 사용하는 쌍은 다음 사항을 만족해야 한다.

  • Secret Keys: 받은 메시지를 디코드할 방법이 있어야 한다. 비밀 키가 이 일을 담당하며, 비밀키는 비밀로 유지하고 숨겨야 한다.
  • Algorithm: 모든 메시지에 적용할 하나의 해시 함수를 선택해야 한다.

 

 HMAC Security

HMAC에서는 특정 해시함수를 규정하고 있지않아 해시함수 어떤 것이나 사용할 수 있는데 보통 MD5를 해시함수로 사용한다. 여기서 의문점이 MD5는 보안상 이미 안전하지 않은 해시함수로 알려져 있는데 왜 MD5를 사용할까? HMAC을 계산할 때 단순히 메시지를 가지고 해싱을 하는 것이 아닌 위에서 말했듯 비밀값도 같이 입력하여 해시값과 일치하는 쌍을 찾아야 한다. 따라서 MD5를 사용하여 HMAC을 계산한다고 하더라도 안전하다고 할 수 있는 것이다.

 

출처

[알고리즘] HMAC(Hash-based Message Authentication Code)이란?

메시지 인증 코드 (MAC): 키 해시(HMAC)