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의 생성된 고유 값이 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 SHA-256의 경우는, 비밀 키를 메시지 데이터와 혼합하여 그 결과를 해시 함수로 해시한 다음 해시 값을 다시 비밀 키와 혼합한 후 해시 함수를 한 번 더 적용한다. 이 과정을 통해 HMAC SHA-256 은 모든 크기의 키(길이가 0인 경우 포함)를 허용하며 길이가 256비트인 해시 시퀀스를 생성한다.
이 방법은 송신자와 수신자가 같은 비밀 키를 공유하는 대칭키 방법이다.
이는 서버-클라이언트 관계처럼 키를 공유해야하는 대상이 많거나 특정할 수 없는 경우에는 비밀 키를 전달하는 과정에서 위험이 발생할 수 있으므로 권장할 수 없다. 하지만, 고객이 한정된 서비스를 제공하거나 서비스 개시 전에 계약서나 직접 방문을 통해 환경을 설정하는 경우에는 비교적 비밀 키 전달과정이 안전하므로 유용하다. 예를 들면, 결제 서비스를 제공하는 곳과 사용하는 곳은 서로간의 신용과 환경 등을 검증하기 때문에 적용할 만 하겠다.
실제로 CyberSource 사의 경우, HMAC SHA-256을 통해 데이터를 인증한다.
HMAC SHA-256 - 바로가기