STM32

STM32F429 하드웨어 키 저장소 사용법

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

STM32F429 하드웨어 키 저장소 사용법

1. 개요

이 글에서는 STM32F429 마이크로컨트롤러에서 제공하는 하드웨어 키 저장소(Hardware Key Storage, HKS)를 사용하는 방법에 대해 자세히 설명합니다. STM32F429는 보안을 강화하기 위해 하드웨어 수준에서 암호화 키를 안전하게 저장하고 관리할 수 있는 기능을 제공합니다. 이를 통해 펌웨어와 데이터를 보호하고, 불법 복제나 리버스 엔지니어링의 위험을 줄일 수 있습니다.

이 포스팅에서는 하드웨어 키 저장소를 구성하고, 키를 저장하고 사용하는 방법, 그리고 보안을 강화하는 방법을 단계별로 설명합니다.


2. 하드웨어 키 저장소란?

하드웨어 키 저장소(HKS)는 STM32F429의 내장 보안 기능으로, 암호화 키를 플래시 메모리나 SRAM과는 별도로 안전하게 보관하는 공간을 의미합니다. 이 저장소는 다음과 같은 특징을 갖고 있습니다.

  • 안전한 저장: 키는 암호화된 형태로 저장되며, 외부에서 직접 접근할 수 없습니다.
  • 제한된 접근: 특정 권한과 조건이 충족되지 않으면 키에 접근할 수 없습니다.
  • 자동 삭제: 전원 해제나 특정 이벤트가 발생하면 키가 자동으로 삭제될 수 있습니다.
  • 하드웨어 지원: 암호화 작업 시 하드웨어 가속기를 통해 빠르고 안전하게 처리됩니다.

3. 하드웨어 키 저장소 설정 방법

3.1. STM32CubeMX 설정

STM32F429에서 하드웨어 키 저장소를 사용하려면 STM32CubeMX를 통해 기본 설정을 완료해야 합니다. 다음 단계에 따라 진행하세요.

  1. 프로젝트 생성:

    • STM32CubeIDE에서 새로운 프로젝트를 생성하고, MCU를 STM32F429로 선택합니다.
  2. RNG(Random Number Generator) 활성화:

    • 하드웨어 키를 생성하기 위해 RNG가 필요합니다.
    • STM32CubeMX에서 RNG를 활성화합니다.
  3. 크립토 라이브러리 활성화:

    • Middleware 탭에서 Crypto Library를 활성화하고, AES 및 HMAC 옵션을 선택합니다.
  4. NVIC 설정:

    • NVIC에서 RNG global interrupt를 활성화하여 무작위 키 생성을 지원합니다.
  5. 코드 생성:

    • 설정이 완료되면 Code Generation을 통해 프로젝트를 생성합니다.

3.2. 프로젝트 설정

코드가 생성된 후, 하드웨어 키 저장소를 초기화하고 사용하는 코드를 작성해야 합니다.

#include "main.h"
#include "stm32f4xx_hal.h"

// RNG 핸들 선언
RNG_HandleTypeDef hrng;

// RNG 초기화 함수
void RNG_Init(void)
{
    __HAL_RCC_RNG_CLK_ENABLE();
    hrng.Instance = RNG;
    if (HAL_RNG_Init(&hrng) != HAL_OK)
    {
        Error_Handler();
    }
}

위 코드는 RNG를 초기화하는 과정입니다. 하드웨어 키를 생성하고 저장하기 위해 무작위 숫자 생성기가 필요합니다.


4. 하드웨어 키 생성 및 저장

4.1. 무작위 키 생성

하드웨어 키는 무작위 값으로 생성하는 것이 보안상 안전합니다. 다음과 같이 RNG를 이용해 무작위 키를 생성할 수 있습니다.

uint32_t GenerateRandomKey(void)
{
    uint32_t randomKey;
    if (HAL_RNG_GenerateRandomNumber(&hrng, &randomKey) != HAL_OK)
    {
        Error_Handler();
    }
    return randomKey;
}

이 코드는 32비트 무작위 키를 생성하는 예제입니다. 필요에 따라 여러 개의 키를 생성하여 128비트, 256비트와 같은 키를 구성할 수도 있습니다.

4.2. 키 저장

STM32F429의 하드웨어 키 저장소는 직접 접근이 불가능하며, 키를 안전하게 저장하려면 AES 키 래핑 기법을 사용해야 합니다.

다음은 AES로 키를 래핑하여 플래시에 안전하게 저장하는 예제입니다.

void StoreKey(uint32_t key)
{
    uint8_t wrappedKey[16];
    HAL_CRYP_HandleTypeDef hcryp;

    // AES 암호화 설정
    hcryp.Instance = CRYP;
    hcryp.Init.DataType = CRYP_DATATYPE_32B;
    hcryp.Init.KeySize = CRYP_KEYSIZE_128B;

    if (HAL_CRYP_Init(&hcryp) != HAL_OK)
    {
        Error_Handler();
    }

    // 키 래핑 수행
    if (HAL_CRYP_Encrypt(&hcryp, (uint8_t*)&key, sizeof(key), wrappedKey, HAL_MAX_DELAY) != HAL_OK)
    {
        Error_Handler();
    }

    // 플래시에 저장 (예: 사용자 정의 메모리 영역)
    Flash_Write(KEY_STORAGE_ADDRESS, wrappedKey, sizeof(wrappedKey));

    HAL_CRYP_DeInit(&hcryp);
}

이 코드는 생성된 키를 AES로 암호화한 후 플래시 메모리에 저장하는 과정입니다. 이때 플래시에 저장된 키는 평문 형태가 아니므로, 보안성이 크게 향상됩니다.


5. 키 사용과 관리

5.1. 키 복원

저장된 키를 복원할 때는 암호화된 형태에서 복호화하는 과정이 필요합니다.

uint32_t RetrieveKey(void)
{
    uint8_t wrappedKey[16];
    uint32_t originalKey;
    HAL_CRYP_HandleTypeDef hcryp;

    // 플래시에서 암호화된 키 읽기
    Flash_Read(KEY_STORAGE_ADDRESS, wrappedKey, sizeof(wrappedKey));

    // AES 복호화 설정
    hcryp.Instance = CRYP;
    hcryp.Init.DataType = CRYP_DATATYPE_32B;
    hcryp.Init.KeySize = CRYP_KEYSIZE_128B;

    if (HAL_CRYP_Init(&hcryp) != HAL_OK)
    {
        Error_Handler();
    }

    // 키 복호화 수행
    if (HAL_CRYP_Decrypt(&hcryp, wrappedKey, sizeof(wrappedKey), (uint8_t*)&originalKey, HAL_MAX_DELAY) != HAL_OK)
    {
        Error_Handler();
    }

    HAL_CRYP_DeInit(&hcryp);
    return originalKey;
}

이 코드는 플래시에서 암호화된 키를 읽어 복호화하고, 원래의 키를 복원하는 과정입니다.

5.2. 키 삭제

보안을 위해 사용이 끝난 키는 반드시 삭제하는 것이 좋습니다. 다음은 플래시에서 키를 삭제하는 예제입니다.

void DeleteKey(void)
{
    uint8_t emptyData[16] = {0};
    Flash_Write(KEY_STORAGE_ADDRESS, emptyData, sizeof(emptyData));
}

이 코드는 플래시에 저장된 키 데이터를 모두 0으로 덮어쓰기 하는 방식으로 삭제하는 과정입니다.


6. 보안 강화 방법

하드웨어 키 저장소를 사용할 때 추가적으로 보안을 강화할 수 있는 방법은 다음과 같습니다.

  1. 정기적인 키 교체:

    • 주기적으로 새로운 무작위 키를 생성하고 기존 키를 폐기하는 방법입니다.
  2. 디버그 포트 비활성화:

    • 키가 외부로 유출되지 않도록 디버그 포트를 비활성화하는 것이 중요합니다.
  3. 부팅 시 무결성 검사:

    • 펌웨어가 시작될 때 저장된 키와 펌웨어의 무결성을 확인하는 절차를 추가하는 것이 좋습니다.
  4. 권한 관리:

    • 키에 접근할 수 있는 코드와 영역을 제한하는 것이 중요합니다.

7. 결론

STM32F429의 하드웨어 키 저장소는 암호화 키를 안전하게 관리하고, 시스템 보안을 강화하는 데 필수적인 역할을 합니다. 이 글에서는 하드웨어 키 저장소를 설정하고 사용하는 방법, 키를 안전하게 저장하고 삭제하는 방법, 그리고 보안을 강화하는 방법에 대해 설명했습니다.

안전한 키 관리는 임베디드 시스템에서 데이터와 펌웨어를 보호하는 핵심 요소입니다. 하드웨어 키 저장소를 효과적으로 활용하여 시스템의 보안성을 높이고, 무단 접근과 데이터 유출을 방지할 수 있습니다.

반응형