HMAC을 이용한 메시지 인증 방법
안녕하세요, 소프트웨어 공장입니다. 이번 포스팅에서는 STM32F429의 암호화 모듈을 활용하여 HMAC(Hash-based Message Authentication Code)을 이용한 메시지 인증 방법에 대해 알아보겠습니다.
HMAC은 메시지와 비밀 키를 사용해 해시 값을 생성함으로써 데이터의 무결성을 검증하고, 데이터가 중간에 변조되지 않았음을 확인할 수 있는 방법입니다. 이는 SHA-1, SHA-256 등과 함께 사용되며, 인증과 무결성 보장에 널리 활용됩니다.
이번 포스팅에서는 다음과 같은 내용을 다룰 예정입니다.
- HMAC의 개요 및 원리
- STM32F429에서 HMAC 구현 방법
- STM32CubeIDE를 이용한 프로젝트 설정
- 예제 코드 작성 및 테스트
그럼, 하나씩 살펴보도록 하겠습니다.
1. HMAC의 개요 및 원리
HMAC은 해시 함수를 기반으로 메시지와 비밀 키를 결합하여 생성된 해시 값을 이용해 데이터의 무결성을 검증하는 방법입니다. 기본적인 동작 과정은 다음과 같습니다.
- 발신자는 비밀 키와 메시지를 조합하여 HMAC 해시 값을 생성합니다.
- 메시지와 함께 HMAC 값을 전송합니다.
- 수신자는 동일한 비밀 키를 사용해 메시지의 HMAC 값을 다시 생성하고, 전송된 HMAC과 비교합니다.
- 일치하면 메시지가 변조되지 않았음을 확인할 수 있습니다.
HMAC의 수식은 다음과 같이 표현됩니다.
HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))
여기서
K
는 비밀 키M
은 메시지H
는 해시 함수(SHA-1, SHA-256 등)opad
는 외부 패딩(0x5c로 채워진 64바이트)ipad
는 내부 패딩(0x36으로 채워진 64바이트)입니다.
STM32F429는 CRYP(암호화/해싱) 모듈을 통해 하드웨어 가속을 지원하므로, 성능과 전력 소모를 최적화하면서 HMAC 연산을 수행할 수 있습니다.
2. STM32F429에서 HMAC 구현 방법
STM32F429에서는 CRYP 모듈을 활용하여 HMAC 연산을 하드웨어적으로 처리할 수 있습니다. 이를 위해 다음과 같은 순서로 진행합니다.
- STM32CubeIDE에서 HMAC 기능을 활성화합니다.
- 비밀 키와 메시지를 준비합니다.
- HAL 라이브러리를 이용해 HMAC 값을 생성합니다.
2.1. STM32CubeMX 설정
STM32CubeMX에서 프로젝트를 생성하고 CRYP 모듈을 활성화하는 과정은 다음과 같습니다.
- STM32CubeIDE에서 새 프로젝트를 생성합니다.
- Peripherals > CRYP를 활성화하고, HMAC 모드를 선택합니다.
- Clock Configuration에서 적절한 클럭 설정을 합니다.
- GPIO와 UART 등 기본 설정을 완료하고, 코드 생성을 진행합니다.
3. STM32CubeIDE에서 HMAC 예제 코드 작성
이제 STM32CubeIDE에서 작성할 HMAC 예제 코드를 살펴보겠습니다. 이 예제에서는 SHA-256을 기반으로 HMAC을 생성하는 방법을 다룹니다.
#include "main.h"
#include "string.h"
#define KEY_SIZE 32
#define MESSAGE_SIZE 64
/* 비밀 키와 메시지 정의 */
uint8_t hmac_key[KEY_SIZE] = {
0x0A, 0x1B, 0x2C, 0x3D, 0x4E, 0x5F, 0x6A, 0x7B,
0x8C, 0x9D, 0xAE, 0xBF, 0xC0, 0xD1, 0xE2, 0xF3,
0x0A, 0x1B, 0x2C, 0x3D, 0x4E, 0x5F, 0x6A, 0x7B,
0x8C, 0x9D, 0xAE, 0xBF, 0xC0, 0xD1, 0xE2, 0xF3
};
uint8_t message[MESSAGE_SIZE] = "Hello, this is a test message for HMAC.";
uint8_t hmac_output[32];
/* HMAC 생성 함수 */
void Generate_HMAC(void)
{
CRYP_HandleTypeDef hcryp;
hcryp.Instance = CRYP;
HAL_CRYP_DeInit(&hcryp);
hcryp.Init.DataType = CRYP_DATATYPE_8B;
hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
hcryp.Init.pKey = hmac_key;
if (HAL_CRYP_Init(&hcryp) != HAL_OK)
{
printf("CRYP 초기화 실패\n");
return;
}
if (HAL_CRYP_HMAC_SHA256(&hcryp, message, MESSAGE_SIZE, hmac_output, HAL_MAX_DELAY) != HAL_OK)
{
printf("HMAC 생성 실패\n");
return;
}
printf("HMAC 값: ");
for (int i = 0; i < 32; i++)
{
printf("%02X ", hmac_output[i]);
}
printf("\n");
HAL_CRYP_DeInit(&hcryp);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
printf("STM32F429 HMAC 예제\n");
Generate_HMAC();
while (1)
{
}
}
3.1. 코드 설명
- 비밀 키 설정:
hmac_key
는 256비트(32바이트) 크기의 비밀 키입니다. - 메시지 설정:
message
는 HMAC 연산 대상이 되는 데이터입니다. - HMAC 생성:
HAL_CRYP_HMAC_SHA256
함수를 이용해 HMAC 값을 생성합니다. - 결과 출력: 생성된 HMAC 값을 콘솔에 출력합니다.
4. 예제 실행 및 결과 확인
- STM32CubeIDE에서 프로젝트를 빌드하고 보드에 업로드합니다.
- 시리얼 모니터(예: Tera Term, PuTTY)를 이용해 UART 로그를 확인합니다.
- 성공적으로 실행되면 다음과 같은 출력이 나타납니다.
STM32F429 HMAC 예제
HMAC 값: 5F 1D 3B 7C 2A 84 E1 92 45 F3 8E 74 A1 B9 0C D4 ...
5. 마무리
이번 포스팅에서는 STM32F429에서 HMAC을 이용해 메시지를 인증하는 방법에 대해 알아보았습니다. HMAC은 데이터 무결성을 검증하고, 신뢰성을 보장하는 데 필수적인 역할을 합니다. 특히 임베디드 시스템에서는 하드웨어 가속 기능을 활용하면 성능과 에너지 효율을 크게 향상시킬 수 있습니다.
'STM32' 카테고리의 다른 글
STM32F429 하드웨어 키 저장소 사용법 (0) | 2025.02.26 |
---|---|
DMA를 이용한 STM32F429 암호화 비동기 처리 방법 (0) | 2025.02.26 |
STM32F429 해시 생성과 검증 방법 (0) | 2025.02.25 |
AES와 DES, Triple DES의 차이점과 성능 비교 (0) | 2025.02.25 |
DES와 3DES로 데이터 보호 (0) | 2025.02.25 |