MAC는 Message Authentication code(메시지 인증 코드)의 줄임말로, 메시지를 인증하기 위해서 사용하는 정보다.
A 유저가 인터넷으로 연결된 B 유저에게 라고 메시지를 보냈다고 가정해보자. 이 메시지에서 "A"가 보냈다는 것은 매우 중요한 정보를 담고 있으며, 따라서 위조 혹은 변조되면 안 된다. 메시지가 인터넷을 가로지르면 아래의 두 가지 보안 위험에 노출 된다.
메시지 변조 : 중간에 누군가가 메세지를 가로채서 내용을 변조 해서 전송한다.
메시지 위조 : 악의 적인 사용자가 올바른 메시지인 것처럼 위조 해서 전송한다.
위의 문제를 해결하기 위해서는 메시지의 무결성과 메시지 인증이 담보되야 한다. 무결성이란 "메시지가 변조되지 않았다는" 성질이며, 메시지 인증 이란 "올바른 송신자로 부터 온 것"이라는 성질이다.
Message Authentication code는 메시지붙이는 작은 정보로 이 것을 이용해서무결성과 인증문제를 해결한다. MAC 생성 프로세스는 아래와 같다.
송신 메시지를 준비한다.
송신 메시지를 MAC함수 MAC()에 통과 시킨다.
MAC()함수의 매개변수로 Authentication key를 넘긴다. 즉 MAC(Message, key)가 될 것이다.
MAC() 함수는 key와 메시지를 이용해서 MAC 정보를 만들고 이것을 메시지에 붙인다.
메시지를 수신한다.
수신측 역시 MAC(Message, key)함수를 이용해서 메시지에 대한 MAC을 만든다.
MAC(Message, key)를 돌려서 나온 MAC과 수신 메시지의 MAC이 일치하면, 이 메시지는 안전한 메시지다.
이를 위해서는 수신측과 송신측이 같은 MAC 함수를 사용해야 하며, Authentication Key(이하 Key)도 일치해야 한다. Key는 메시지와 송신자가 안전한 방법으로 미리 공유해야 할 것이다.
HMAC
Keyed-hash message authentication code(HMAC)은 MAC의 특정한 구현이다. MD5, SHA-1과 같은 해시기반 함수를 이용해서 MAC 정보를 만든다. 어떤 알고리즘을 사용하느냐에 따라서 HMAC-SHA1, HMAC-MD5리고 부른다. 단방향 해시 함수라면 어떤 것이든지 이용 할 수 있다. 따라서 HMAC의 암호 강도는 어떤 크기의 해시를 사용하는지에 따라서 달라진다. 아래 코드는 MAC-MD5, MAC-SHA1, MAC-SHA256 세가지 방식으로 MAC을 만든다.
macManager.encryptUrl() 메서드는 URL에 유닉스 시간을 더한 값에, hmac-sha1을 적용했다. 이렇게 만들어진 hmac을 URL 파라메터에 덧 붙여서 (API Gateway 등의)서버에 전송한다. 서버에서는 URL과 시간 값을 이용해서 mac 코드를 만들고 이 값이 요청과 일치하는지 확인하는 것으로 올바른 API 요청인지를 검사 할 수 있다. 또한 API 요청이 만들어진 시간을 확인해서 일정 시간이 지난 API는 요청을 거부하는 것으로 replay 공격을 막을 수 있다.
현재 시간을 계산한 값을 URL에 덧붙인다. 예제 코드에서는 byte를 더했는데, string 연산을 해도 상관은 없다.
인코딩된 mac을 url 파라메터로 넘기고, 시간은 fragment 로 넘겼다.
API Gateway는 url과 fragment를 더해서 MAC 을 만든다. 이 MAC과 url 파라메터의 MAC이 일치하면 올바른 요청이다.
Contents
MAC
HMAC
HMAC의 취약점
응용
참고
Recent Posts
Archive Posts
Tags