STM32F429 암호화 모듈 사용법 - OTP(One-Time Programmable) 메모리 활용
이번 포스팅에서는 STM32F429 마이크로컨트롤러의 보안 기능 중 하나인 OTP(One-Time Programmable) 메모리 활용 방법에 대해 설명드립니다. OTP 메모리는 단 한 번만 데이터를 기록할 수 있으며, 기록된 후에는 수정이 불가능하여 키 관리와 시스템 보안을 강화하는 데 효과적입니다. 특히, 펌웨어 무결성을 검증하거나 중요한 암호화 키를 안전하게 저장하는 용도로 사용됩니다.
1. OTP 메모리란 무엇인가?
OTP(One-Time Programmable) 메모리는 반도체 메모리의 일종으로, 데이터를 한 번 기록하면 변경할 수 없는 특성을 갖습니다. STM32F429에서는 메모리의 특정 영역이 OTP로 구성되어 있으며, 이 영역은 보안 키, 제품 시리얼 번호, 사용자 정의 데이터 등을 안전하게 보관하는 역할을 합니다.
OTP 메모리는 다음과 같은 특징을 갖습니다.
- 한 번만 기록 가능: 데이터를 기록하면 수정이나 삭제가 불가능합니다.
- 읽기 보호: 보안 설정을 통해 외부 접근을 제한할 수 있습니다.
- 보안 강화: 중요한 정보를 펌웨어와 분리된 영역에 저장하여 시스템의 보안을 높입니다.
2. STM32F429에서 OTP 메모리 구성
STM32F429에서는 플래시 메모리의 시스템 메모리 영역에 OTP 블록이 할당되어 있습니다. 이 메모리는 일반적인 플래시 메모리와는 다르게 구성되어 있으며, 별도의 접근 방법을 통해 관리됩니다.
OTP 메모리의 구성은 다음과 같이 이루어집니다.
- 사용자 데이터 영역: 사용자 정의 데이터를 저장하는 영역입니다.
- 보안 키 영역: 암호화 키와 같은 민감한 정보를 저장하는 영역입니다.
- 읽기 보호 플래그: 메모리 접근을 제한하는 보안 플래그입니다.
3. OTP 메모리 활용 시 고려사항
OTP 메모리를 사용할 때는 다음과 같은 사항을 염두에 두어야 합니다.
- 단일 기록: 기록된 데이터는 변경할 수 없으므로, 기록 전에 충분한 검토가 필요합니다.
- 보안 설정: 읽기 보호와 같은 보안 기능을 활성화하여 외부 접근을 차단해야 합니다.
- 정확한 주소 관리: OTP 메모리는 특정 주소에 할당되므로, 잘못된 주소 접근을 피해야 합니다.
4. STM32CubeIDE를 이용한 OTP 메모리 설정 및 데이터 기록
STM32CubeIDE와 HAL 라이브러리를 사용하여 OTP 메모리를 설정하고 데이터를 기록하는 방법을 단계별로 설명드립니다.
4.1. 프로젝트 생성 및 환경 설정
- STM32CubeIDE를 실행하고 새로운 프로젝트를 생성합니다.
- 보드를 STM32F429로 선택하고 기본 클럭 및 환경을 설정합니다.
- 프로젝트 생성 후,
stm32f4xx_hal_flash.h
와stm32f4xx_hal_flash_ex.h
헤더 파일을 포함합니다.
4.2. OTP 메모리 데이터 기록
아래는 HAL 라이브러리를 이용하여 OTP 메모리에 데이터를 기록하는 예제 코드입니다.
#include "stm32f4xx_hal.h"
#define OTP_ADDRESS 0x1FFF7800 // 예제 주소, 데이터시트 참고
void Write_OTP(uint32_t address, uint32_t data) {
HAL_FLASH_Unlock();
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) == HAL_OK) {
printf("OTP 메모리에 데이터 기록 완료: 0x%08X\n", data);
} else {
printf("OTP 메모리 기록 실패\n");
}
HAL_FLASH_Lock();
}
int main(void) {
HAL_Init();
SystemClock_Config();
uint32_t data = 0x12345678;
Write_OTP(OTP_ADDRESS, data);
while (1) {}
}
4.3. OTP 메모리 데이터 읽기
기록된 데이터를 읽는 방법은 다음과 같습니다.
uint32_t Read_OTP(uint32_t address) {
return *(volatile uint32_t *)address;
}
int main(void) {
HAL_Init();
SystemClock_Config();
uint32_t read_data = Read_OTP(OTP_ADDRESS);
printf("OTP 메모리에서 읽은 데이터: 0x%08X\n", read_data);
while (1) {}
}
5. 보안 강화 방법
OTP 메모리를 사용할 때는 다음과 같은 보안 강화를 위한 방법을 적용하는 것이 중요합니다.
- 읽기 보호 활성화: 데이터 기록 후, 읽기 보호 플래그를 설정하여 외부 접근을 차단합니다.
- 시리얼 번호 및 제품 ID 저장: 제품의 고유 식별 정보를 OTP에 저장하여 무단 복제를 방지합니다.
- 암호화 키 관리: 펌웨어와 분리된 영역에 키를 저장하여 시스템의 무결성을 유지합니다.
예를 들어, 읽기 보호를 활성화하는 코드는 다음과 같습니다.
void Enable_Read_Protection(void) {
FLASH_OBProgramInitTypeDef obInit;
HAL_FLASHEx_OBGetConfig(&obInit);
obInit.OptionType = OPTIONBYTE_RDP;
obInit.RDPLevel = OB_RDP_LEVEL_1;
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
HAL_FLASHEx_OBProgram(&obInit);
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
}
6. 결론
STM32F429의 OTP 메모리는 시스템의 보안을 강화하고, 중요한 데이터를 안전하게 관리하는 데 필수적인 기능입니다. 특히, 암호화 키와 시리얼 번호와 같은 민감한 정보를 저장하고, 무단 접근을 차단하는 역할을 수행합니다.
다만, 한 번 기록된 데이터는 수정이 불가능하므로, 사전 검토와 정확한 계획이 필요합니다. 이번 포스팅에서 소개한 방법을 통해 OTP 메모리를 효과적으로 활용하시고, 보다 안전한 시스템을 구현하시기를 바랍니다.
'STM32' 카테고리의 다른 글
HMAC을 활용한 안전한 부팅 과정 구현 (0) | 2025.02.26 |
---|---|
STM32F429 펌웨어 무결성 검증 - SHA-256을 이용한 검증 방법 (0) | 2025.02.26 |
STM32F429 하드웨어 키 저장소 사용법 (0) | 2025.02.26 |
DMA를 이용한 STM32F429 암호화 비동기 처리 방법 (0) | 2025.02.26 |
HMAC을 이용한 메시지 인증 방법 (0) | 2025.02.25 |