ESP32 IDF

ESP32 IDF에서 SHA-256, SHA-512 등 해싱 알고리즘 사용법

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

ESP32 IDF에서 SHA-256, SHA-512 등 해싱 알고리즘 사용법

1. 개요

해싱(Hashing)은 입력 데이터를 고정된 크기의 해시 값으로 변환하는 과정으로, 데이터의 무결성 검증이나 비밀번호 저장 등에 널리 사용됩니다. ESP32 IDF(ESP-IDF)에서는 mbedtls 라이브러리를 통해 다양한 해싱 알고리즘을 제공하며, 이 글에서는 SHA-256 및 SHA-512 알고리즘을 활용하는 방법을 설명하겠습니다.

2. SHA 알고리즘 개요

SHA(Secure Hash Algorithm)는 보안 해시 알고리즘으로, 다양한 버전이 존재합니다. 그중 대표적인 알고리즘은 다음과 같습니다.

  • SHA-1: 160비트 해시 값을 생성하지만, 현재는 보안성이 약하여 사용이 권장되지 않습니다.
  • SHA-256: 256비트(32바이트) 해시 값을 생성하며, 비교적 높은 보안성을 제공합니다.
  • SHA-512: 512비트(64바이트) 해시 값을 생성하여, 더욱 강력한 보안성을 제공합니다.

ESP-IDF는 기본적으로 mbedtls 라이브러리를 통해 SHA-256, SHA-512 등의 해싱 기능을 지원합니다.

3. ESP-IDF에서 SHA-256 사용 방법

3.1. mbedtls 라이브러리 포함하기

ESP-IDF에서 SHA 기능을 사용하려면 mbedtls 라이브러리를 포함해야 합니다. 기본적으로 ESP-IDF는 mbedtls를 내장하고 있으므로 추가적인 설정 없이 바로 사용할 수 있습니다.

3.2. SHA-256 해시 계산 예제 코드

다음은 ESP32에서 mbedtls 라이브러리를 사용하여 SHA-256 해시를 계산하는 예제 코드입니다.

#include <stdio.h>
#include "mbedtls/sha256.h"

void calculate_sha256(const unsigned char *input, size_t length, unsigned char output[32]) {
    mbedtls_sha256_context ctx;
    mbedtls_sha256_init(&ctx);
    mbedtls_sha256_starts(&ctx, 0);  // 0: SHA-256 (1: SHA-224)
    mbedtls_sha256_update(&ctx, input, length);
    mbedtls_sha256_finish(&ctx, output);
    mbedtls_sha256_free(&ctx);
}

void print_hash(const unsigned char *hash, size_t length) {
    for (size_t i = 0; i < length; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");
}

void app_main() {
    const char *data = "Hello, ESP32!";
    unsigned char hash[32];
    calculate_sha256((const unsigned char *)data, strlen(data), hash);
    printf("SHA-256 Hash: ");
    print_hash(hash, 32);
}

3.3. 코드 설명

  1. mbedtls_sha256_init()을 호출하여 SHA-256 컨텍스트를 초기화합니다.
  2. mbedtls_sha256_starts()를 통해 SHA-256 모드를 설정합니다.
  3. mbedtls_sha256_update()를 사용하여 데이터를 입력받아 해싱을 수행합니다.
  4. mbedtls_sha256_finish()를 호출하여 최종 해시 값을 얻습니다.
  5. mbedtls_sha256_free()를 호출하여 사용한 리소스를 해제합니다.

4. ESP-IDF에서 SHA-512 사용 방법

SHA-512를 사용하는 방식도 SHA-256과 유사하며, 다만 mbedtls/sha512.h 헤더를 사용해야 합니다.

4.1. SHA-512 해시 계산 예제 코드

#include <stdio.h>
#include "mbedtls/sha512.h"

void calculate_sha512(const unsigned char *input, size_t length, unsigned char output[64]) {
    mbedtls_sha512_context ctx;
    mbedtls_sha512_init(&ctx);
    mbedtls_sha512_starts(&ctx, 0);  // 0: SHA-512 (1: SHA-384)
    mbedtls_sha512_update(&ctx, input, length);
    mbedtls_sha512_finish(&ctx, output);
    mbedtls_sha512_free(&ctx);
}

void app_main() {
    const char *data = "Hello, ESP32!";
    unsigned char hash[64];
    calculate_sha512((const unsigned char *)data, strlen(data), hash);
    printf("SHA-512 Hash: ");
    print_hash(hash, 64);
}

4.2. SHA-512 코드 설명

SHA-512의 코드 흐름은 SHA-256과 동일하지만, 다음과 같은 차이가 있습니다.

  • mbedtls_sha512_context 구조체를 사용합니다.
  • mbedtls_sha512_init(), mbedtls_sha512_starts(), mbedtls_sha512_update(), mbedtls_sha512_finish(), mbedtls_sha512_free() 함수를 사용합니다.
  • 출력 해시 크기는 512비트(64바이트)입니다.

5. 해싱 결과 검증 방법

ESP32에서 생성한 해시 값을 온라인 SHA 계산기와 비교하여 결과가 일치하는지 검증할 수 있습니다. 예를 들어, Hello, ESP32!의 SHA-256 해시 값은 다음과 같습니다.

SHA-256: 0d8dd9d12f88dcab23d2b4e6fcb4a1c69f3e318662df1f5e3e78554d77423f63

SHA-512 해시 값은 다음과 같습니다.

SHA-512: 6107eea5f9232ae30eaf11a43d0e7c5f9840dd8e9afeb06327884d04e60f8c2b
         d7fcf4b8f8a3ea6c79c7d06c737823a4b45ebecf5a2b59cfe3a53e1f3e7b4b6a

6. 결론

이 글에서는 ESP32 IDF에서 SHA-256 및 SHA-512 해시 알고리즘을 사용하는 방법을 설명했습니다. mbedtls 라이브러리를 활용하여 쉽게 해시 값을 생성할 수 있으며, 이를 통해 데이터 무결성 검증이나 보안 기능을 구현할 수 있습니다.

반응형