소개
디지털 통신 세계에서는 메시지가 비공개로 유지되는 것뿐만 아니라 전송 중에 변조되지 않았는지 (무결성) 그리고 주장된 발신자로부터 실제로 왔는지 (인증) 를 보장하는 것이 매우 중요합니다. 간단한 해시 함수는 우발적인 데이터 손상은 확인할 수 있지만, 악의적인 변조를 막을 수는 없습니다. 왜냐하면 누구나 수정된 메시지의 해시를 다시 계산할 수 있기 때문입니다.
이때 HMAC(Hash-based Message Authentication Code, 해시 기반 메시지 인증 코드) 가 필요합니다. HMAC 는 암호화 해시 함수 (예: SHA-256) 와 비밀 키를 결합한 특정 유형의 MAC(Message Authentication Code, 메시지 인증 코드) 입니다. 비밀 키를 가진 당사자만이 주어진 메시지에 대한 HMAC 를 생성하고 검증할 수 있습니다. 이 과정은 데이터 무결성과 인증을 모두 제공합니다.
본 실습에서는 HMAC 에 대한 실습 경험을 쌓게 됩니다. 먼저 개념을 이해한 다음, 강력한 openssl 명령줄 도구를 사용하여 키를 생성하고 HMAC 를 계산해 볼 것입니다. 마지막으로 애플리케이션 개발에서 흔히 사용되는 작업인 Python 스크립트에서 HMAC 를 구현하는 방법을 살펴보겠습니다.
HMAC 소개
이 단계에서는 HMAC 의 기본 개념과 이것이 안전한 통신에 왜 필수적인지 다룹니다.
SHA-256 과 같은 표준 해시 함수는 입력 메시지를 받아 해시 또는 다이제스트 (digest) 라고 알려진 고정 크기의 문자열을 생성합니다. 메시지의 비트 하나만 변경되어도 결과 해시는 완전히 달라집니다. 이는 데이터 무결성을 확인하는 데 매우 유용합니다. 하지만 인증 (authenticity) 을 제공하지는 않습니다. 공격자가 메시지를 가로채고 수정하는 경우, 변조된 메시지에 대해 새로운 해시를 간단히 계산하여 함께 보낼 수 있습니다. 그러면 수신자는 메시지가 변경되었는지 알 방법이 없습니다.
HMAC 는 해싱 프로세스에 비밀 대칭 키를 도입하여 이 문제를 해결합니다. 대칭 키는 송신자와 의도된 수신자만이 공유하는 비밀 정보의 일부입니다.
HMAC 프로세스는 대략 다음과 같이 작동합니다.
- 송신자는 비밀 키와 메시지를 결합합니다.
- 이 조합에 해시 함수 (예: SHA-256) 를 적용합니다.
- 결과 해시 (이제 HMAC 라고 함) 를 원본 메시지와 함께 전송합니다.
수신자가 메시지와 HMAC 를 받으면, 자신의 비밀 키 사본을 사용하여 동일한 계산을 수행합니다.
- 계산된 HMAC 가 수신된 HMAC 와 일치하면, 수신자는 메시지가 변경되지 않았음 (무결성) 을 알고 비밀 키를 가진 사람으로부터 왔음 (인증) 을 알게 됩니다.
- HMAC 가 일치하지 않으면, 메시지는 손상된 것으로 간주되어 폐기되어야 합니다.
이 단계는 순전히 개념적인 내용입니다. 다음 단계에서는 이 이론을 실제로 적용해 볼 것입니다.
HMAC 비밀 키 생성
이 단계에서는 HMAC 보안의 기반이 되는 안전하고 무작위적인 비밀 키를 생성합니다. 예측 가능한 키는 공격자가 HMAC 를 위조할 수 있게 만듭니다. 우리는 다목적 암호화 명령줄 유틸리티인 openssl 도구를 사용할 것입니다.
무작위 데이터를 생성하기 위해 openssl rand 명령을 사용할 것입니다.
-hex: 이 옵션은openssl에게 무작위 데이터를 16 진수 문자열로 출력하도록 지시합니다.32: 이는 생성할 무작위 바이트 수를 지정합니다. 32 바이트는 256 비트와 같으며, 특히 SHA-256 해시 알고리즘과 함께 사용될 때 강력하고 일반적으로 사용되는 키 길이입니다.
후속 명령에서 키를 쉽게 사용하기 위해, 생성된 키를 HMAC_KEY라는 환경 변수에 저장할 것입니다. 터미널에서 다음 명령을 실행하십시오.
export HMAC_KEY=$(openssl rand -hex 32)
이 명령은 openssl rand -hex 32를 실행하고, 그 출력 (16 진수 키) 을 캡처하여 HMAC_KEY 변수에 할당합니다.
echo 명령을 사용하여 방금 생성한 키를 볼 수 있습니다.
echo $HMAC_KEY
긴 16 진수 문자열이 표시되어야 합니다. 귀하의 키는 고유할 것입니다.
0db348c78473ce8460416f875cd87239d0f5f66fbe5103ba4b5c84cf2cd76914
이제 비밀 키가 준비되었으므로 HMAC 를 생성할 준비가 되었습니다.
HMAC-SHA256 계산
이 단계에서는 생성한 키를 사용하여 샘플 메시지에 대한 HMAC 를 계산합니다. 먼저, 메시지를 포함하는 파일을 생성해 보겠습니다.
echo 명령을 사용하여 message.txt라는 파일을 생성할 것입니다. -n 플래그는 echo가 문자열 끝에 줄 바꿈 문자 (newline character) 를 추가하는 것을 방지하므로 중요합니다. 이 문자가 추가되면 콘텐츠가 변경되어 최종 HMAC 도 달라지게 됩니다.
echo -n "This is a secret message." > message.txt
이제 메시지와 키를 사용하여 HMAC 를 계산할 수 있습니다. 메시지 다이제스트 (해시) 계산에 사용되는 openssl dgst 명령을 사용할 것입니다.
-sha256: SHA-256 해시 알고리즘을 사용하려는 것을 지정합니다.-mac hmac: HMAC 방식을 사용하여 메시지 인증 코드 (MAC) 를 계산하려는 것을 지정합니다.-macopt hexkey:$HMAC_KEY: 이는 MAC 알고리즘에 대한 옵션을 제공합니다. 여기서는 키가 16 진수 형식 (hexkey) 임을 지정하고, 이전에 생성한 환경 변수$HMAC_KEY를 사용하여 키 자체를 전달합니다.message.txt: 인증할 데이터를 포함하는 입력 파일입니다.
HMAC 를 생성하려면 다음 명령을 실행하십시오.
openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt
출력 결과는 비밀 키로 계산된 메시지의 HMAC 다이제스트가 됩니다. 출력 형식은 사용된 알고리즘과 결과 HMAC 값을 보여줍니다.
HMAC-SHA2-256(message.txt)= 214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8
이 HMAC 값은 비밀 키를 가지고 있는 수신자에게 메시지와 함께 전송할 값입니다.
HMAC 무결성 검증
이 단계에서는 HMAC 검증 프로세스가 실제로 어떻게 작동하는지 확인할 것입니다. 올바른 키를 사용할 때 성공하는 반면, 잘못된 키를 사용하거나 메시지를 수정한 경우 실패하는 것을 관찰하게 됩니다.
올바른 키를 사용한 검증
검증은 특별한 명령이 아닙니다. 이는 수신자가 자체적으로 HMAC 를 다시 계산하여 수신한 HMAC 와 비교하는 행위 그 자체입니다. 이전 단계의 명령을 다시 실행하면 정확히 동일한 HMAC 값을 얻게 됩니다. 이는 키와 메시지가 변경되지 않는 한 HMAC 가 일관됨을 확인시켜 줍니다.
잘못된 키로 인한 실패 관찰
이제 공격자 또는 잘못된 구성을 시뮬레이션하기 위해 다른 키로 메시지를 검증해 보겠습니다. 먼저, 새롭고 "잘못된" 키를 생성합니다.
export WRONG_KEY=$(openssl rand -hex 32)
이제 원래의 message.txt에 대해 HMAC 를 계산하되, 이 WRONG_KEY를 사용해 보겠습니다.
openssl dgst -sha256 -mac hmac -macopt hexkey:$WRONG_KEY message.txt
출력에서 완전히 새로운 HMAC 값을 보게 될 것입니다.
HMAC-SHA2-256(message.txt)= 781729497e89f3f9cb1d8c7ab632e22753062ac39cd64de0e5b81a45de245d78
이 HMAC 는 올바른 $HMAC_KEY로 생성한 HMAC 와 완전히 다르다는 점에 유의하십시오. 이는 올바른 비밀 키 없이는 메시지에 대한 유효한 HMAC 를 생성할 수 없음을 입증하며, 이를 통해 무결성 (authenticity) 이 보장됩니다.
메시지 수정으로 인한 실패 관찰
메시지 자체가 변조되었을 때 어떤 일이 발생하는지도 살펴보겠습니다. message.txt를 약간 수정하겠습니다.
echo -n "This is a tampered message." > message.txt
이제 원래의 올바른 키 ($HMAC_KEY) 를 사용하여 HMAC 를 다시 계산합니다.
openssl dgst -sha256 -mac hmac -macopt hexkey:$HMAC_KEY message.txt
다시 한번, 완전히 다른 HMAC 값을 얻게 될 것입니다. 이는 메시지에 대한 사소한 수정이라도 감지되어 무결성 (integrity) 이 보장됨을 증명합니다.
Python 에서 HMAC 구현
이 단계에서는 Python 을 사용하여 프로그래밍 방식으로 HMAC 작업을 수행하는 방법을 알아봅니다. 이는 메시지 보안을 보장해야 하는 웹 애플리케이션, API 및 기타 소프트웨어에서 흔히 요구되는 사항입니다. Python 의 표준 라이브러리는 이 목적을 위해 hmac 및 hashlib 모듈을 제공합니다.
메시지의 HMAC-SHA256 을 계산하는 간단한 Python 스크립트를 작성해 보겠습니다. 먼저, nano 텍스트 편집기를 사용하여 hmac_example.py 파일을 엽니다.
nano hmac_example.py
이제 다음 Python 코드를 nano 편집기에 복사하여 붙여넣습니다. 이 코드는 필요한 라이브러리를 가져오고, 키와 메시지를 정의한 다음, HMAC 를 계산하고 출력합니다.
참고: 이 예제에서는 키와 메시지를 하드코딩하고 있습니다. 실제 애플리케이션에서는 키가 안전하게 저장되고 관리되어야 합니다. 키와 메시지 모두 바이트 문자열 (byte strings) 이어야 하므로 앞에 b를 붙입니다.
import hmac
import hashlib
## The secret key (must be bytes)
## In a real app, get this from a secure location
key = b'\x0d\xb3\x48\xc7\x84\x73\xce\x84\x60\x41\x6f\x87\x5c\xd8\x72\x39\xd0\xf5\xf6\x6f\xbe\x51\x03\xba\x4b\x5c\x84\xcf\x2c\xd7\x69\x14'
## The message to authenticate (must be bytes)
message = b'This is a secret message.'
## 1. Create a new HMAC object
## - Pass the key
## - Pass the message
## - Specify the hash algorithm (from hashlib)
h = hmac.new(key, message, hashlib.sha256)
## 2. Get the digest in hexadecimal format
hex_digest = h.hexdigest()
print("HMAC Digest:")
print(hex_digest)
코드를 붙여넣은 후, Ctrl+O를 누른 다음 파일 이름을 확인하기 위해 Enter를 누르고, 마지막으로 Ctrl+X를 눌러 nano를 저장하고 종료합니다.
이제 터미널에서 Python 스크립트를 실행합니다.
python3 hmac_example.py
스크립트가 실행되어 계산된 HMAC 다이제스트가 출력됩니다.
HMAC Digest:
214fbb56f716dfe1c2f4a60615a5b901b263fd74c9678b2aef4f01779b34dea8
이제 Python 에서 HMAC 생성을 성공적으로 구현했으며, 이는 안전한 소프트웨어 구축에 직접적으로 적용할 수 있는 기술입니다.
요약
본 실습 (lab) 을 통해 현대 암호학에서 데이터 무결성 및 인증을 보장하는 초석인 HMAC(Hash-based Message Authentication Code, 해시 기반 메시지 인증 코드) 에 대한 실질적인 경험을 쌓았습니다.
다음과 같은 내용을 학습했습니다.
- HMAC 는 암호화 해시 함수와 비밀 키를 결합하여 메시지 인증 코드를 생성합니다.
- 비밀 키를 가진 당사자만이 HMAC 를 생성하거나 검증할 수 있으므로 무단 수정 및 위조를 방지합니다.
openssl명령줄 도구는 임의의 키 생성 (openssl rand) 및 HMAC 계산 (openssl dgst) 을 포함하여 암호화 작업을 수행하는 강력한 유틸리티입니다.- 메시지의 작은 변경이나 잘못된 키 사용은 완전히 다른 HMAC 결과를 초래하여 변조를 쉽게 감지할 수 있게 합니다.
- Python 은
hmac및hashlib라이브러리를 제공하여 애플리케이션에 HMAC 기능을 쉽게 통합할 수 있도록 합니다.
HMAC 를 숙달함으로써 보다 안전하고 신뢰할 수 있는 시스템을 구축하는 중요한 단계를 밟았습니다.



