STM32F429 하드웨어 키 저장소 사용법
1. 개요
이 글에서는 STM32F429 마이크로컨트롤러에서 제공하는 하드웨어 키 저장소(Hardware Key Storage, HKS)를 사용하는 방법에 대해 자세히 설명합니다. STM32F429는 보안을 강화하기 위해 하드웨어 수준에서 암호화 키를 안전하게 저장하고 관리할 수 있는 기능을 제공합니다. 이를 통해 펌웨어와 데이터를 보호하고, 불법 복제나 리버스 엔지니어링의 위험을 줄일 수 있습니다.
이 포스팅에서는 하드웨어 키 저장소를 구성하고, 키를 저장하고 사용하는 방법, 그리고 보안을 강화하는 방법을 단계별로 설명합니다.
2. 하드웨어 키 저장소란?
하드웨어 키 저장소(HKS)는 STM32F429의 내장 보안 기능으로, 암호화 키를 플래시 메모리나 SRAM과는 별도로 안전하게 보관하는 공간을 의미합니다. 이 저장소는 다음과 같은 특징을 갖고 있습니다.
- 안전한 저장: 키는 암호화된 형태로 저장되며, 외부에서 직접 접근할 수 없습니다.
- 제한된 접근: 특정 권한과 조건이 충족되지 않으면 키에 접근할 수 없습니다.
- 자동 삭제: 전원 해제나 특정 이벤트가 발생하면 키가 자동으로 삭제될 수 있습니다.
- 하드웨어 지원: 암호화 작업 시 하드웨어 가속기를 통해 빠르고 안전하게 처리됩니다.
3. 하드웨어 키 저장소 설정 방법
3.1. STM32CubeMX 설정
STM32F429에서 하드웨어 키 저장소를 사용하려면 STM32CubeMX를 통해 기본 설정을 완료해야 합니다. 다음 단계에 따라 진행하세요.
프로젝트 생성:
- STM32CubeIDE에서 새로운 프로젝트를 생성하고, MCU를 STM32F429로 선택합니다.
RNG(Random Number Generator) 활성화:
- 하드웨어 키를 생성하기 위해 RNG가 필요합니다.
- STM32CubeMX에서 RNG를 활성화합니다.
크립토 라이브러리 활성화:
- Middleware 탭에서 Crypto Library를 활성화하고, AES 및 HMAC 옵션을 선택합니다.
NVIC 설정:
- NVIC에서 RNG global interrupt를 활성화하여 무작위 키 생성을 지원합니다.
코드 생성:
- 설정이 완료되면 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. 보안 강화 방법
하드웨어 키 저장소를 사용할 때 추가적으로 보안을 강화할 수 있는 방법은 다음과 같습니다.
정기적인 키 교체:
- 주기적으로 새로운 무작위 키를 생성하고 기존 키를 폐기하는 방법입니다.
디버그 포트 비활성화:
- 키가 외부로 유출되지 않도록 디버그 포트를 비활성화하는 것이 중요합니다.
부팅 시 무결성 검사:
- 펌웨어가 시작될 때 저장된 키와 펌웨어의 무결성을 확인하는 절차를 추가하는 것이 좋습니다.
권한 관리:
- 키에 접근할 수 있는 코드와 영역을 제한하는 것이 중요합니다.
7. 결론
STM32F429의 하드웨어 키 저장소는 암호화 키를 안전하게 관리하고, 시스템 보안을 강화하는 데 필수적인 역할을 합니다. 이 글에서는 하드웨어 키 저장소를 설정하고 사용하는 방법, 키를 안전하게 저장하고 삭제하는 방법, 그리고 보안을 강화하는 방법에 대해 설명했습니다.
안전한 키 관리는 임베디드 시스템에서 데이터와 펌웨어를 보호하는 핵심 요소입니다. 하드웨어 키 저장소를 효과적으로 활용하여 시스템의 보안성을 높이고, 무단 접근과 데이터 유출을 방지할 수 있습니다.
'STM32' 카테고리의 다른 글
STM32F429 펌웨어 무결성 검증 - SHA-256을 이용한 검증 방법 (0) | 2025.02.26 |
---|---|
STM32F429 암호화 모듈 사용법 - OTP(One-Time Programmable) 메모리 활용 (0) | 2025.02.26 |
DMA를 이용한 STM32F429 암호화 비동기 처리 방법 (0) | 2025.02.26 |
HMAC을 이용한 메시지 인증 방법 (0) | 2025.02.25 |
STM32F429 해시 생성과 검증 방법 (0) | 2025.02.25 |