Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 HMAC 키 해싱으로 메시지 인증 구현하는 방법


파이썬에서 암호화 해시 함수를 이용한 메시지 인증은 HMAC(Hash-based Message Authentication Code) 메커니즘을 통해 손쉽게 구현할 수 있습니다. MD5, SHA-1과 같은 다양한 해시 함수를 공유 비밀 키와 조합하여 HMAC을 활용하면 데이터의 무결성과 진위 여부를 안전하게 검증할 수 있습니다.

핵심 아이디어는 실제 데이터와 공유 비밀 키를 결합하여 암호화 해시 값을 생성하는 것입니다. 최종 결과물에는 비밀 키가 포함되지 않은 채 전송되지만, 수신 측에서는 생성된 해시 값을 이용해 전송되거나 저장된 메시지가 변조되지 않았는지 확인할 수 있습니다.

기본 문법

hmac.new(key, msg=None, digestmod=None)

위 함수는 새로운 HMAC 객체를 생성하여 반환합니다. 각 매개변수는 다음과 같습니다.

  • key – 송신자와 수신자가 공유하는 비밀 키입니다.

  • msg – 해싱할 대상 메시지입니다.

  • digestmod – HMAC 객체가 사용할 다이제스트 알고리즘의 이름 또는 모듈입니다.

HMAC 모듈의 주요 메서드와 속성

  • hmac.update(message)
    주어진 메시지로 HMAC 객체를 갱신합니다. 이 메서드를 여러 번 호출하면 메시지가 순차적으로 누적(append)됩니다.

  • hmac.digest()
    지금까지 update() 메서드에 전달된 바이트 데이터의 다이제스트를 반환합니다.

  • hmac.hexdigest()
    digest()와 동일하지만, 결과가 16진수 문자만 포함하는 두 배 길이의 문자열로 반환됩니다. 이메일 등 바이너리 데이터를 직접 전송할 수 없는 환경에서 값을 안전하게 교환할 때 유용합니다.

  • hmac.copy()
    현재 HMAC 객체의 복사본("클론")을 반환합니다. 동일한 키 상태에서 여러 해시를 계산해야 할 때 효율적입니다.

예제 1: MD5 알고리즘으로 해시 생성하기

다음은 기본 해시 알고리즘인 MD5를 사용해 해시 값을 생성하는 예제입니다.

# 라이브러리 임포트
import hashlib
import hmac

# 데이터
update_bytes = b'Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
    Suspendisse tristique condimentum viverra. Nulla accumsan \
    orci risus, non congue lacus feugiat id.'

# 비밀 키
password = b'402xy5#'

# md5를 사용해 암호화 해시 생성
my_hmac = hmac.new(update_bytes, password, hashlib.md5)
print("첫 번째 다이제스트: " + str(my_hmac.digest()))
print("정식 알고리즘 이름: " + my_hmac.name)
print("블록 크기: " + str(my_hmac.block_size) + "바이트")
print("다이제스트 크기: " + str(my_hmac.digest_size) + "바이트")

# hmac 객체의 복사본 생성
my_hmac_cpy = my_hmac.copy()
print("복사된 다이제스트: " + str(my_hmac_cpy.digest()))

실행 결과

첫 번째 다이제스트: b'H\xcc.nf\xdd\x8bC\x8di\x0cC\xb8\xe9l\xa8'
정식 알고리즘 이름: hmac-md5
블록 크기: 64바이트
다이제스트 크기: 16바이트
복사된 다이제스트: b'H\xcc.nf\xdd\x8bC\x8di\x0cC\xb8\xe9l\xa8'

SHA-1 알고리즘으로 변경하기

SHA-1은 MD5보다 더 안전한 것으로 평가받는 알고리즘입니다. 위 프로그램을 SHA-1 기반으로 실행하려면 해당 줄에서 알고리즘 이름만 변경하면 됩니다.

my_hmac = hmac.new(update_bytes, password, hashlib.sha1)

실행 결과는 다음과 같습니다.

첫 번째 다이제스트: b'\xc3T\xe7[\xc8\xa3O/$\xbd`A\xad\x07d\xe8\xae\xa2!\xb4'
정식 알고리즘 이름: hmac-sha1
블록 크기: 64바이트
다이제스트 크기: 20바이트
복사된 다이제스트: b'\xc3T\xe7[\xc8\xa3O/$\xbd`A\xad\x07d\xe8\xae\xa2!\xb4'

참고로 MD5와 SHA-1은 현재 충돌(collision) 취약점이 발견된 구식 알고리즘이므로, 실제 운영 환경에서는 hashlib.sha256 또는 그 이상의 알고리즘을 사용하는 것이 권장됩니다.

활용 분야

HMAC 인증 메커니즘은 보안이 중요한 모든 환경, 특히 공개 네트워크 서비스에서 널리 사용됩니다. 예를 들어 공개 네트워크에서 파이프(pipe)나 소켓(socket)을 통해 중요한 파일이나 데이터를 전송할 때, 해당 데이터에 먼저 서명(signature)을 붙인 후 수신 측에서 데이터를 사용하기 전에 반드시 서명을 검증해야 합니다. 이 과정을 통해 중간자 공격이나 데이터 변조 시도를 효과적으로 차단할 수 있습니다.