HMAC(Hash-based Message Authentication Code, 해시기반 메시지 인증 코드)와 SHA(Secure Hash Algorithm)-256 약자의 조합으로, 인증 코드(여기서는 MAC)를 해시(여기서는 SHA) 값을 이용해 만드는 방법을 말한다. RFC 2104로 1997년에 작성되었으며, Java, ASP.NET, C#, C++, Ruby, PHP, Perl, VB 등 다양한 언어에서 지원하고 있다.
(SHA-256과 같은)해시 알고리즘이란?
먼저 해시 알고리즘부터 살펴보자. 해시는 많은 용량의 데이터를 고정된 크기의 고유 값으로 만드는 것이다. 두 데이터를 이용해 만든 해시 값이 각각 있을 때, 해시 값들은 데이터가 일치하는 경우에만 일치한다. 데이터가 약간만 달라져도 해시에는 예측할 수 없는 큰 변화가 발생하며 전혀 다른 값이 되며, 이를 일명 눈사태 효과라고 부른다.
참고로 데이터가 없는 경우에도 고정된 크기의 고유 값은 만들어 진다. 위키피디아의 예제를 발췌해 많이 사용하는 해시 알고리즘을 살펴보면, 아래와 같다.
HMAC_MD5("", "") = 0x74e6f7298a9c2d168935f58c001bad88 HMAC_SHA1("", "") = 0xfbdb1d1b18aa6c08324b7d64b71fb76370690e1d HMAC_SHA256("", "") = 0xb613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad
SHA-256의 생성된 고유 값이 256비트라고, SHA-1가 1비트인 것은 아니다. SHA는 1993년부터 미국 NSA가 제작하고 미국 국립표준기술연구소(NIST)가 표준으로 제작한 알고리즘으로, 버전에 따라 SHA-0, SHA-1, SHA-2, SHA-3 순으로 올라간다. SHA-1에서의 숫자는 ver.1을 가리키고, SHA-2를 기반으로 한 SHA-224, SHA-256, SHA-384, SHA-512에서는 뒤의 숫자가 생성된 고유 값의 길이를 가리키며, 고유 값의 길이는 MD5의 경우 128비트, SHA-1은 160비트, SHA-256은 256비트이다.
SHA-1은 2008년에 보안에 심각한 결함이 발견되어 SHA-2로 교체되었으며,현재는 SHA-3가 나왔다.
위에서 말 했듯이, 해시 함수를 이용하면 데이터가 동일할 때만 같은 값을 가지는 해시 값을 만들 수 있다. 이를 이용해 데이터의 수정 또는 변경은 검출할 수 있다. 하지만, 거짓 행세는 찾을 수 없기 때문에 인증이 필요해진다. 이 인증에 사용되는 방법이 메시지 인증코드와 디지털 서명이다.
HMAC란?
간단히 HMAC(해시 메시지 인증코드)부터 설명하면, 송신자와 수신자만이 공유하고 있는 키와 메시지를 혼합해 해시 값을 만드는 것이다.
HMAC는 송신자와 수신자가 비밀 키를 공유할 경우 보안되지 않은 채널을 통해 보낸 메시지가 훼손되었는지 여부를 확인하는 데 사용할 수 있다. 송신자는 원래 데이터의 해시 값을 계산하여 원래 데이터와 해시 값을 모두 단일 메시지로 보내고, 수신자는 받은 메시지에 대해 해시 값을 다시 계산하고 계산된 HMAC가 전송된 HMAC와 일치하는지 확인한다.
메시지를 변경하거나 올바른 해시 값을 다시 만들기 위해서는 비밀 키를 알아야 하므로 악의적 사용자가 데이터나 해시 값을 변경하면 불일치 상태가 발생하게 된다. 그러므로 원래 해시 값과 계산된 해시 값이 일치할 경우에 메시지가 바르다고 인증할 수 있게 된다.
HMAC SHA-256의 경우는, 비밀 키를 메시지 데이터와 혼합하여 그 결과를 해시 함수로 해시한 다음 해시 값을 다시 비밀 키와 혼합한 후 해시 함수를 한 번 더 적용한다.
이 과정을 통해 HMAC SHA-256 은 모든 크기의 키(길이가 0인 경우 포함)를 허용하며 길이가 256비트인 해시 시퀀스를 생성한다.
마지막으로, 위 방법은 송신자와 수신자가 같은 비밀 키를 공유하는 대칭키 방법이다.
이는 서버-클라이언트 관계처럼 키를 공유해야하는 대상이 많거나 특정할 수 없는 경우에는 비밀 키를 전달하는 과정에서 위험이 발생할 수 있으므로 권장할 수 없다. 하지만, 고객이 한정된 서비스를 제공하거나 서비스 개시 전에 계약서나 직접 방문을 통해 환경을 설정하는 경우에는 비교적 비밀 키 전달과정이 안전하므로 유용하다. 예를 들면, 결제 서비스를 제공하는 곳과 사용하는 곳은 서로간의 신용과 환경 등을 검증하기 때문에 적용할 만 하겠다.
실제로 CyberSource 사의 경우, HMAC SHA-256을 통해 데이터를 인증한다.
그 밖에
참고로, HMAC SHA-256만 있는 것이 아니라, HMAC MD5, HMAC SHA-1도 있다.
MD5도 보안관련 용도로 사용한 적이 있으나, 암호화 결함이 발견되어 현재는 아래 그림 처럼, 파일 무결성 검사용으로 많이 쓰인다.
한국의 인터넷 뱅킹은 2011년까지 보안상 이유로 사용을 권장하지 않는 SHA-1를 사용하였다. 최근, 구글에서 sha-1의 보안상 이슈가 있다는 이론을 실제 재현한 바 있다.
참조
- HMAC의 WIKI 정의 (영문)
- RFC2104 : HMAC: Keyed-Hashing for Message Authentication (영문)
- HMAC SHA256은 어떻게 쓰나요? (영문)
- .NET Framework 4.5의 HMASHA256 클래스 소개 (한글)
- 해쉬함수별 출력값 길이비교
- 해시함수 소개 PPT
- 다양한 언어로 구현된 HMAC SHA-256 예제 (영문)
- 데이터 출처 인증 (영문)
- HMAC SHA-256 계산기
- 구글, 구형 암호기술 ‘SHA1’ 허점 입증했다
좋은 글 감사합니다.
감사합니다 🙂
잘읽었습니다 감사합니다.