PX4 MAVLink-Python 프로그래밍: 5-2. [참고]HMAC-SHA256이란?

안녕하세요. 마케팅팀 에이든(Aiden)입니다.

오늘 소개해드릴 내용은 PX4 MAVLINK-PYTHON 프로그래밍 – MAVLINK 2 메세지 서명 과정에서 참고하실 수 있는 HMAC-SHA256입니다. 해당 내용은 저희 QUAD 드론 연구소의 저작권으로 등록되어있는 내용이며 무단 배포는 지양해주시길 부탁드립니다.


✳️ HMAC = Hash-based Message Authentication Code

  • “해시 기반 메시지 인증 코드”
  • 데이터의 무결성과 인증을 동시에 보장하는 기법
  • HMAC 자체는 특정 해시 알고리즘을 기반으로 동작함

예) HMAC-SHA256 → HMAC 방식에서 SHA-256 해시 함수 사용


⚙️ 어떻게 작동하나?

입력:

  • message (예: MAVLink 메시지 전체)
  • secret key (서명 시 공유된 비밀 키)
  • SHA-256 해시 함수

출력:

  • 32바이트(256비트)짜리 고유한 해시값

🔁 내부 동작 요약

  1. 비밀 키와 메시지를 조합
  2. 내부적으로 두 번 SHA-256 해싱 수행 (inner, outer)
  3. 결과는 메시지와 키가 완벽히 동일하지 않으면 절대 일치하지 않는 해시값

🔒 왜 HMAC-SHA256이 강력한가?

특성설명
✅ 인증성누가 보냈는지 확인 가능 (비밀 키 공유한 상대만 생성 가능)
✅ 무결성메시지가 중간에 변조되었는지 탐지 가능
🚫 키 없음해시값만 봐서는 원본 메시지도, 키도 절대 알 수 없음
🔁 비결정성 방지같은 입력에는 항상 같은 출력 (Deterministic), 예측 가능

📦 MAVLink 2에서 HMAC-SHA256 쓰는 이유

  • MAVLink는 오픈된 프로토콜이라 누구든지 sniff(도청) 가능
  • HMAC-SHA256으로 서명하면, 도청자는 서명을 위조할 수 없음
  • 드론이 수신 시 서명을 검증하여 위조된 명령 거부

🧪 서명 생성 코드 (예제)

Python
import hmac
import hashlib

key = b'secret_shared_key_32_bytes____1234567890'
message = b'hello drone'

signature = hmac.new(key, message, hashlib.sha256).digest()

print(signature.hex())

결과는 항상 64자리(= 32바이트) 16진수 문자열입니다. (16진수=4bit)

🧪 검증 코드 (예제)

Python
import hmac
import hashlib

# 받은 message와 signature
message = b'hello drone'
received_signature_hex = '...'  # 위의 예제 코드에서 받은 signature(예): 'd2f17e42c7a9e4f30d82b3a7...'

# 이 서명이 진짜 맞는지 검증만 가능
key = b'secret_shared_key_32_bytes____1234567890'
expected_signature = hmac.new(key, message, hashlib.sha256).digest().hex()

if received_signature_hex == expected_signature:
    print("✅ 서명이 유효합니다!")
else:
    print("❌ 서명이 유효하지 않습니다.")

🧪 실제 MAVLINK 서명 활용 (예제)

Python
import hmac
import hashlib
from pymavlink import mavutil

# 드론과 GCS가 공유하는 32바이트 Secret Key
SECRET_KEY = b'secret_shared_key_32_bytes____1234567890'

# 연결 생성 (서명 사용 안 함, 수동으로 검증하기 위해)
the_connection = mavutil.mavlink_connection('udp:127.0.0.1:14550')

while True:
    msg = the_connection.recv_msg()

    if msg is None:
        continue

    # MAVLink 2만 서명 사용 가능
    if msg.get_msgbuf()[0] != 0xFD:
        continue

    # 메시지 전체 raw 바이트
    raw_packet = msg.get_msgbuf()

    # 메시지 끝에서 13바이트 서명 블록 추출
    signature_block = raw_packet[-13:]
    link_id = signature_block[0]
    timestamp = signature_block[1:7]
    received_signature = signature_block[7:]

    # 서명 대상은 메시지 본문 + link_id + timestamp
    signed_part = raw_packet[:-13] + signature_block[:7]

    # HMAC 계산
    computed_signature = hmac.new(
        SECRET_KEY,
        signed_part,
        hashlib.sha256
    ).digest()[:6]  # 앞 6바이트만 비교

    if received_signature == computed_signature:
        print(f"✅ 서명 확인됨: {msg.get_type()}")
    else:
        print(f"❌ 서명 위조 또는 키 불일치: {msg.get_type()}")

YOUTUBE 강좌

재생

이상으로 PX4 MAVLINK-Python 프로그래밍다섯번째 단계인 MAVLINK 신뢰성 보장에서 참고하실 수 있는 HMAC-SHA256이란 무엇인지 알아보았습니다. 다음 글은 비행 모드 (PX4 멀티콥터) 에 대한 글로 돌아오겠습니다.


작성자: 에이든(Aiden), 쿼드(QUAD) 드론연구소 마케팅팀

기고일: 2026.03.08

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다