C언어로 파일을 읽어 해시값 생성하기

C언어에서 파일을 읽어 해시값을 생성하는 방법에 대해 소개합니다. 해시값은 데이터의 무결성을 검증하는 데 중요한 역할을 합니다. 본 기사에서는 C언어로 파일을 읽고 해시값을 계산하는 과정과 관련된 기본적인 개념을 설명합니다.

해시값이란 무엇인가


해시값은 주어진 데이터를 고정된 길이의 값으로 변환한 결과로, 데이터 무결성 검사 및 데이터 검색에서 중요한 역할을 합니다.

해시값의 용도

  • 무결성 검사: 파일이 변조되었는지 확인할 수 있습니다.
  • 데이터 검색: 특정 데이터를 빠르게 찾는 데 활용됩니다.

C언어에서 파일 읽기


C언어에서 파일을 읽기 위해서는 <stdio.h> 라이브러리를 사용합니다. fopen, fread 함수를 이용하여 파일을 열고 내용을 읽을 수 있습니다.

파일 읽기 예시

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "rb");
    if (file == NULL) {
        printf("파일 열기 실패\n");
        return 1;
    }

    // 파일 처리 코드
    fclose(file);
    return 0;
}

해시 함수 소개


파일의 내용을 해시값으로 변환하는 과정에는 해시 함수가 필요합니다. C언어에서 사용되는 대표적인 해시 함수로는 MD5, SHA-1, SHA-256 등이 있습니다.

SHA-256 해시 함수


SHA-256은 256비트의 고유한 해시값을 생성하는 알고리즘입니다. 안전한 해시값을 생성할 수 있어 파일 검증에 많이 사용됩니다.

C언어에서 SHA-256 구현하기


C언어에서 SHA-256을 구현하려면 OpenSSL 라이브러리 또는 별도의 라이브러리를 사용해야 합니다. OpenSSL은 SHA-256을 지원하는 함수들을 제공합니다.

OpenSSL SHA-256 예시

#include <openssl/sha.h>
#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "rb");
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);

    unsigned char buffer[1024];
    size_t bytesRead;
    while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
        SHA256_Update(&sha256, buffer, bytesRead);
    }

    SHA256_Final(hash, &sha256);
    fclose(file);

    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");

    return 0;
}

파일을 읽으며 해시값 계산하기


파일을 읽으면서 해시값을 계산하는 과정은 파일을 일정 크기씩 나누어 처리하면서 해시를 업데이트하는 방식으로 진행됩니다.

버퍼 크기 조정


버퍼 크기는 메모리 사용을 최적화하기 위해 조정할 수 있습니다. 1024바이트 정도가 일반적으로 사용되며, 파일 크기에 따라 더 큰 버퍼를 사용할 수도 있습니다.

버퍼 크기 조정 예시

#define BUFFER_SIZE 2048  // 버퍼 크기를 2048로 설정

unsigned char buffer[BUFFER_SIZE];

해시값 출력 및 활용


해시값은 보통 16진수로 출력됩니다. 이를 통해 파일이 변조되었는지 확인하거나, 여러 파일의 해시값을 비교할 수 있습니다.

해시값 비교 예시


두 파일의 해시값을 비교하여 동일한 파일인지 확인하는 방법은 다음과 같습니다.

if (memcmp(hash1, hash2, SHA256_DIGEST_LENGTH) == 0) {
    printf("두 파일은 동일합니다.\n");
} else {
    printf("두 파일은 다릅니다.\n");
}

이 방법을 사용하면 파일이 동일한지 쉽게 확인할 수 있습니다.

해시값을 활용한 파일 검증


파일을 다운로드하거나 전송할 때, 해시값을 제공하여 다운로드된 파일이 원본과 동일한지 검증할 수 있습니다. 이 방식은 파일 전송 중의 오류를 방지하고 보안을 강화하는 데 유용합니다.

파일 검증 과정

  1. 원본 파일 해시값 생성: 원본 파일의 SHA-256 해시값을 계산하여 사용자에게 제공합니다.
  2. 파일 다운로드 후 해시값 계산: 사용자는 파일을 다운로드한 후, 해당 파일의 SHA-256 해시값을 다시 계산합니다.
  3. 해시값 비교: 다운로드한 파일의 해시값과 제공된 원본 해시값을 비교하여 파일이 변조되지 않았음을 확인합니다.

파일 검증 예시

if (memcmp(downloaded_hash, original_hash, SHA256_DIGEST_LENGTH) == 0) {
    printf("파일이 올바르게 다운로드되었습니다.\n");
} else {
    printf("파일이 변조되었습니다.\n");
}

보안적인 고려사항


해시 함수는 파일의 무결성 검사 외에도 보안적 측면에서 매우 중요합니다. 예를 들어, 패스워드 저장 시 해시값을 사용하여 실제 패스워드를 저장하지 않고도 인증을 할 수 있습니다.

패스워드 저장과 해시


사용자의 패스워드를 저장할 때, 원본 패스워드를 해시값으로 변환하여 저장하면, 데이터베이스가 해킹되더라도 원본 패스워드를 보호할 수 있습니다. 해시값만 저장되기 때문에, 해커가 데이터베이스에 접근하더라도 실제 패스워드를 알 수 없습니다.

해시된 패스워드 검증 예시

if (memcmp(stored_hash, user_input_hash, SHA256_DIGEST_LENGTH) == 0) {
    printf("로그인 성공\n");
} else {
    printf("로그인 실패\n");
}

요약


C언어에서 파일을 읽고 SHA-256 해시값을 생성하는 방법에 대해 설명했습니다. 해시값은 파일 무결성 검사, 보안 등에 중요한 역할을 하며, OpenSSL 라이브러리를 사용하여 SHA-256을 구현하는 방법을 소개했습니다. 해시값을 활용하여 파일이 변조되었는지 확인하고, 패스워드 저장과 같은 보안적인 용도로 활용할 수 있습니다.