STM32

STM32F429 해시 생성과 검증 방법

임베디드 친구 2025. 2. 25. 17:13
728x90
반응형

STM32F429 해시 생성과 검증 방법

1. 서론

STM32F429 시리즈는 ARM Cortex-M4 코어를 기반으로 한 고성능 마이크로컨트롤러로, 다양한 임베디드 시스템과 IoT 장치에서 널리 사용되고 있습니다. 특히 이 시리즈는 하드웨어 암호화 모듈을 내장하고 있어, 데이터 무결성 검증과 보안 기능을 손쉽게 구현할 수 있습니다.

이번 포스팅에서는 STM32F429의 해시 생성과 검증 방법에 대해 다룹니다. 주로 SHA-1과 SHA-256 알고리즘을 이용하여 데이터를 해싱하고, 이를 검증하는 방법을 설명하겠습니다. 이는 데이터의 변조 여부를 확인하는 데 필수적인 기능으로, 특히 통신 중 데이터 무결성을 보장하거나 펌웨어 무결성을 검사하는 과정에서 유용하게 활용될 수 있습니다.

2. 해시(Hash) 알고리즘 개요

해시 알고리즘은 입력 데이터를 고정된 크기의 고유한 값으로 변환하는 함수입니다. 이 과정에서 원본 데이터를 추측할 수 없도록 설계된 일방향 함수가 사용됩니다. 주요 해시 알고리즘인 SHA-1과 SHA-256은 다음과 같은 특징을 가집니다.

2.1 SHA-1

  • 해시 길이: 160비트 (20바이트)
  • 속도가 빠르고 구현이 간단하지만, 충돌 공격에 대해 약점이 존재합니다.
  • 보안 요구사항이 높지 않은 임베디드 환경에서 사용할 수 있습니다.

2.2 SHA-256

  • 해시 길이: 256비트 (32바이트)
  • 보안성이 높으며, 현재 권장되는 해시 알고리즘 중 하나입니다.
  • 속도가 다소 느릴 수 있지만, 데이터 무결성 검증에서는 충분히 실용적입니다.

3. STM32CubeIDE 프로젝트 설정

이제 STM32F429에서 해시 알고리즘을 구현하기 위해 STM32CubeIDE에서 프로젝트를 설정하는 방법을 설명합니다. 이 과정은 기본적인 프로젝트가 이미 설정되어 있다는 가정 하에 진행됩니다.

  1. STM32CubeIDE에서 프로젝트 열기:

    • 기존에 생성된 프로젝트를 엽니다.
  2. HAL 라이브러리 설정:

    • STM32CubeMXConfiguration 탭에서 HASH 모듈을 활성화합니다.
    • RCC에서 AHB2 peripheral clocks 섹션에 HASH 클럭을 활성화합니다.
  3. 코드 생성:

    • 설정이 완료되면 Project -> Generate Code를 선택하여 코드를 생성합니다.

4. 해시 생성 방법

STM32F429에서는 HAL 라이브러리를 사용하여 간단하게 해시를 생성할 수 있습니다. 다음은 SHA-1과 SHA-256 해시를 생성하는 예제입니다.

4.1 주요 코드 예제

4.1.1 SHA-1 해시 생성

#include "main.h"
#include "string.h"

HASH_HandleTypeDef hhash;

void HashSHA1Example(void)
{
    uint8_t data[] = "Hello, STM32!";
    uint8_t hash[20]; // SHA-1 해시 길이: 20바이트

    // 해시 모듈 초기화
    hhash.Init.DataType = HASH_DATATYPE_8B;
    if (HAL_HASH_Init(&hhash) != HAL_OK)
    {
        Error_Handler();
    }

    // SHA-1 해시 생성
    if (HAL_HASH_SHA1_Start(&hhash, data, strlen((char*)data), hash, HAL_MAX_DELAY) != HAL_OK)
    {
        Error_Handler();
    }

    // 해시 출력
    printf("SHA-1 Hash:\n");
    for (int i = 0; i < 20; i++)
    {
        printf("%02X ", hash[i]);
    }
    printf("\n");
}

4.1.2 SHA-256 해시 생성

void HashSHA256Example(void)
{
    uint8_t data[] = "Hello, STM32!";
    uint8_t hash[32]; // SHA-256 해시 길이: 32바이트

    // SHA-256 해시 생성
    if (HAL_HASH_SHA256_Start(&hhash, data, strlen((char*)data), hash, HAL_MAX_DELAY) != HAL_OK)
    {
        Error_Handler();
    }

    // 해시 출력
    printf("SHA-256 Hash:\n");
    for (int i = 0; i < 32; i++)
    {
        printf("%02X ", hash[i]);
    }
    printf("\n");
}

4.2 주요 코드 설명

  1. 데이터 입력: data 배열에 해싱할 데이터를 입력합니다.
  2. 해시 생성: HAL_HASH_SHA1_Start 또는 HAL_HASH_SHA256_Start API를 이용해 해시를 생성합니다.
  3. 결과 출력: 생성된 해시 값을 16진수 형태로 출력합니다.

5. 해시 검증 방법

해시 검증은 데이터를 다시 해싱하여 기존 해시와 비교하는 방식으로 이루어집니다. 다음은 SHA-256을 이용한 간단한 검증 예제입니다.

void VerifySHA256(void)
{
    uint8_t originalData[] = "Hello, STM32!";
    uint8_t expectedHash[32] = {0x3F, 0xA8, 0x0B, 0x69, 0x57, 0xD0, 0x7B, 0xB0, 0x5F, 0x53, 0x2C, 0xE3, 0xD1, 0x8D, 0xF6, 0xDC,
                                 0x1D, 0xE5, 0xA4, 0xD5, 0x49, 0x5F, 0x33, 0x63, 0x96, 0x54, 0xD1, 0x93, 0x3D, 0xB4, 0xD0, 0x11};
    uint8_t generatedHash[32];

    // SHA-256 해시 생성
    if (HAL_HASH_SHA256_Start(&hhash, originalData, strlen((char*)originalData), generatedHash, HAL_MAX_DELAY) != HAL_OK)
    {
        Error_Handler();
    }

    // 해시 비교
    if (memcmp(expectedHash, generatedHash, 32) == 0)
    {
        printf("해시 검증 성공: 데이터가 변경되지 않았습니다.\n");
    }
    else
    {
        printf("해시 검증 실패: 데이터가 변경되었습니다.\n");
    }
}

5.1 검증 과정 설명

  1. 해시 생성: 원본 데이터를 SHA-256으로 해싱합니다.
  2. 해시 비교: memcmp 함수를 사용해 기대하는 해시와 생성된 해시를 비교합니다.
  3. 검증 결과 출력: 결과에 따라 성공 또는 실패 메시지를 출력합니다.

6. 에러 처리와 디버깅

해시 생성 과정에서 문제가 발생하면 HAL 함수는 HAL_ERROR를 반환합니다. 이를 처리하기 위해 다음과 같은 에러 핸들러를 정의할 수 있습니다.

void Error_Handler(void)
{
    printf("오류가 발생했습니다. 시스템을 재설정합니다.\n");
    while (1)
    {
    }
}

또한, 디버그 모드에서 printf를 활용하여 데이터와 해시 값을 비교하면서 문제를 추적하는 방법도 유용합니다.

7. 최적화 및 권장 사항

  1. DMA 사용: 대용량 데이터의 해싱 성능을 높이기 위해 DMA를 활용하는 방법을 고려할 수 있습니다.
  2. 메모리 관리: 해시 연산 중에는 적절한 메모리 관리를 통해 스택 오버플로우와 같은 문제를 방지해야 합니다.
  3. 보안 고려: 해시 값은 변조 방지를 위해 별도의 안전한 메모리 영역에 저장하는 것이 좋습니다.

8. 결론

이번 포스팅에서는 STM32F429의 해시 생성과 검증 방법에 대해 살펴보았습니다. SHA-1과 SHA-256 알고리즘을 사용해 데이터를 해싱하고, 이를 검증하는 방법을 예제와 함께 상세히 설명했습니다. 이러한 기술은 임베디드 시스템에서 데이터 무결성을 보장하는 데 중요한 역할을 합니다.

반응형