nRF52

HMAC와 nRF52 SDK를 활용한 실습

임베디드 친구 2025. 2. 20. 15:51
728x90
반응형

HMAC와 nRF52 SDK를 활용한 실습

1. HMAC의 개념과 필요성

1.1 HMAC란 무엇인가?

HMAC(Hash-based Message Authentication Code)는 해시 함수를 기반으로 하는 메시지 인증 코드입니다. 이는 특정 키와 메시지를 조합하여 고유의 해시 값을 생성하고, 해당 해시 값이 메시지의 무결성과 송신자 인증을 보장하는 역할을 합니다.

HMAC는 다음과 같은 특징을 가지고 있습니다:

  • 무결성 보장: 데이터가 전송 중에 변조되지 않았음을 확인합니다.
  • 인증 기능: 송신자가 사전에 공유된 비밀 키를 소유하고 있는지 확인합니다.
  • 충돌 저항성: 해시 함수의 특성을 이용하여 다른 입력 값이 동일한 출력 값을 가지는 가능성을 낮춥니다.

1.2 HMAC의 동작 원리

HMAC는 다음과 같은 절차로 동작합니다:

  1. 송신자는 메시지와 비밀 키를 사용하여 HMAC 값을 생성합니다.
  2. 생성된 HMAC 값과 메시지를 함께 수신자에게 전송합니다.
  3. 수신자는 수신된 메시지와 비밀 키를 이용해 HMAC 값을 다시 계산합니다.
  4. 수신자가 계산한 HMAC 값과 송신자가 보낸 HMAC 값을 비교하여 무결성을 검증합니다.

HMAC의 공식은 다음과 같이 표현할 수 있습니다.

$$
HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))
$$

  • $H$ : 해시 함수 (예: SHA-256)
  • $K$ : 비밀 키
  • $M$ : 메시지
  • $opad$ : 외부 패딩 (0x5c로 채워진 블록)
  • $ipad$ : 내부 패딩 (0x36으로 채워진 블록)

2. nRF52 SDK에서 HMAC 활용하기

2.1 nRF52에서 HMAC 지원

nRF52840과 같은 Nordic SoC는 Cryptocell-310 하드웨어 가속기를 통해 HMAC 연산을 효율적으로 수행할 수 있습니다. 이는 소프트웨어만을 이용할 때보다 빠르고 안전하게 HMAC 연산을 수행할 수 있도록 지원합니다.

nRF5 SDK는 nrf_crypto 라이브러리를 통해 HMAC 기능을 제공합니다. 이번 실습에서는 nRF52840 DK와 nRF5 SDK를 활용하여 HMAC을 사용하는 방법을 알아보겠습니다.

2.2 개발 환경 준비

HMAC 실습을 위해 다음과 같은 환경이 필요합니다.

  • 하드웨어: nRF52840 DK
  • 소프트웨어:
    • nRF5 SDK (버전 17.x 이상 권장)
    • SEGGER Embedded Studio (SES)
    • nRF Command Line Tools

nRF5 SDK 다운로드 및 설정

  1. Nordic Semiconductor 개발자 페이지에서 최신 nRF5 SDK를 다운로드합니다.
  2. 환경 변수 SDK_ROOT를 SDK 경로로 설정합니다.
  3. SEGGER Embedded Studio에서 nRF5 SDK/examples 폴더의 예제 프로젝트를 열어 SDK가 정상적으로 동작하는지 확인합니다.

2.3 HMAC 예제 코드 작성

아래는 nRF52 SDK를 활용해 HMAC을 계산하고 검증하는 예제 코드입니다.

#include <stdio.h>
#include "nrf_crypto.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

#define HMAC_KEY "secret_key"
#define MESSAGE "Hello, nRF52840!"

static void hmac_calculate(void)
{
    uint8_t hmac_result[32];
    size_t hmac_len = sizeof(hmac_result);

    // 키와 메시지 설정
    uint8_t key[] = HMAC_KEY;
    uint8_t message[] = MESSAGE;

    // HMAC 생성
    ret_code_t ret = nrf_crypto_hmac_calculate(
        NRF_CRYPTO_HMAC_SHA256,
        key,
        strlen((char *)key),
        message,
        strlen((char *)message),
        hmac_result,
        &hmac_len
    );

    if (ret == NRF_SUCCESS)
    {
        NRF_LOG_INFO("HMAC 생성 성공. 결과:");
        for (size_t i = 0; i < hmac_len; i++)
        {
            NRF_LOG_INFO("%02x", hmac_result[i]);
        }
    }
    else
    {
        NRF_LOG_ERROR("HMAC 생성 실패. 오류 코드: %d", ret);
    }
}

int main(void)
{
    // 로그 초기화
    NRF_LOG_INIT(NULL);
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    NRF_LOG_INFO("nRF52 HMAC 예제 시작.");

    // HMAC 계산 실행
    hmac_calculate();

    // 무한 루프
    while (true)
    {
        NRF_LOG_FLUSH();
    }
}

2.4 코드 설명

  1. 키와 메시지 정의: HMAC_KEYMESSAGE 매크로를 통해 HMAC에 사용할 키와 메시지를 정의합니다.
  2. HMAC 생성: nrf_crypto_hmac_calculate 함수를 사용해 HMAC을 생성하고 결과를 hmac_result 배열에 저장합니다.
  3. 로그 출력: 생성된 HMAC 값을 16진수 형식으로 출력합니다.

2.5 빌드 및 실행

  1. SEGGER Embedded Studio에서 프로젝트를 열고 빌드합니다.
  2. nRF52840 DK를 PC에 연결하고 펌웨어를 플래시합니다.
  3. 터미널에서 J-Link RTT Viewer를 실행하여 로그를 확인합니다.

3. 실습 결과 확인

HMAC 계산이 성공하면 다음과 같은 로그를 확인할 수 있습니다.

nRF52 HMAC 예제 시작.
HMAC 생성 성공. 결과:
6a 3f 55 0c d2 0b 13 a5 91 48 4b 09 a7 74 0c c9 84 7e 1a 0c 9a 6d 17 85 89 3f b5 c2 3d 2e 4a b3

만약 오류가 발생하면 다음과 같은 로그가 출력됩니다.

HMAC 생성 실패. 오류 코드: -1

4. HMAC 검증과 보안 고려사항

4.1 HMAC 검증 방법

수신자는 동일한 비밀 키를 사용해 HMAC을 재계산하고, 송신된 HMAC 값과 비교하여 무결성을 검증합니다. 이를 위해 다음과 같은 코드를 추가할 수 있습니다.

static void hmac_verify(uint8_t *expected_hmac, size_t expected_len)
{
    uint8_t hmac_result[32];
    size_t hmac_len = sizeof(hmac_result);

    ret_code_t ret = nrf_crypto_hmac_calculate(
        NRF_CRYPTO_HMAC_SHA256,
        (uint8_t *)HMAC_KEY,
        strlen(HMAC_KEY),
        (uint8_t *)MESSAGE,
        strlen(MESSAGE),
        hmac_result,
        &hmac_len
    );

    if (ret == NRF_SUCCESS && memcmp(hmac_result, expected_hmac, expected_len) == 0)
    {
        NRF_LOG_INFO("HMAC 검증 성공. 데이터 무결성 확인 완료.");
    }
    else
    {
        NRF_LOG_ERROR("HMAC 검증 실패. 데이터가 변경되었을 수 있습니다.");
    }
}

4.2 보안 고려사항

  1. 비밀 키 관리: 키는 안전하게 저장하고 전송 과정에서 노출되지 않도록 해야 합니다.
  2. 해시 함수 선택: SHA-256과 같은 안전한 해시 알고리즘을 사용해야 합니다.
  3. 재전송 공격 방지: 메시지와 함께 타임스탬프나 난수(nonce)를 사용해 중복된 메시지 전송을 방지해야 합니다.

5. 결론

HMAC은 메시지의 무결성과 송신자 인증을 보장하는 강력한 방법입니다. nRF52840과 nRF5 SDK를 활용하면 하드웨어 가속기를 통해 효율적으로 HMAC 연산을 수행할 수 있습니다. 본 실습을 통해 HMAC 생성과 검증 과정을 이해하고, 임베디드 환경에서 보안을 강화하는 방법을 익힐 수 있었을 것입니다.

앞으로의 프로젝트에서도 HMAC을 활용해 데이터를 보호하고, 안전한 통신을 구현하는 데 활용해 보시기 바랍니다.

반응형