목차
- 무결성이란?
- C openssl 라이브러리 활용 개발 환경 구성 이전 포스팅
- SHA256 해시 관련 이전 포스팅
- 원본 파일 SHA256 해시 값 구하기 예제
- 복제본 파일 무결성 검사 예제
- 결과확인
무결성이란?
무결성은 데이터나 정보가 변조되거나 손상되지 않은 상태를 나타냅니다.
데이터의 무결성은 데이터가 원래의 형태나 값 그대로 보존되고, 무단으로 변경되거나 손상되지 않음을 의미합니다.
C openssl 라이브러리 활용 개발 환경 구성 이전 포스팅
오늘 파일 무결성 검증 코드를 구현하기에 앞서 반드시 C 언어로 openssl 라이브러리를 활용하는 개발 환경을 구성해야 아래 예제를 수행할 수 있습니다. 따라서 만약 개발환경을 구성하지 않았다면 아래 링크를 통해 구성해주세요.
2023.07.28 - [C] - [C/C++] Openssl 정적 라이브러리 빌드 및 Codelite 설치, 개발 환경 구성(ubuntu, codelite)
SHA256 해시 관련 이전 포스팅
또한, 오늘 포스팅에서 다루는 파일 무결성 검증은 SHA256 해시 알고리즘의 특성을 이용한 코드입니다. 해시는 단방향 암호화로서 1바이트의 값만 달라지더라도 해시값이 모두 변형이되는 특성을 가지고 있습니다. 무결성 검증은 이러한 특성을 활용한 것입니다.
오늘 예제에서는 SHA256을 사용할 예정입니다. 따라서 위 알고리즘에 대해 아직 모르신다면 아래 링크를 타고 SHA256에 대해 먼저 학습해주세요.
2023.07.28 - [C] - [C/C++] Openssl 활용 SHA256 해시 예제
원본 파일 SHA256 해시 값 구하기 예제
우선 무결성 검사 대상이되는 원본 파일의 SHA256 해시값을 구하는 프로그램을 작성합니다. 사용자에게 파일의 경로를 입력받아 파일 데이터를 읽고 모든 데이터를 해시합니다. 이렇게 나온 해시 결과값은 추후 복사본 무결성 검증에 사용됩니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
int main() {
char filename[1024];
char expected_hash[65];
unsigned char hash[SHA256_DIGEST_LENGTH];
char hash_str[65];
printf("Enter the filename: ");
fgets(filename, sizeof(filename), stdin);
filename[strcspn(filename, "\n")] = 0;
// Open the file
FILE *file = fopen(filename, "rb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// Calculate SHA-256 hash
{
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);
}
// Convert the hash to a string
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
sprintf(&hash_str[i * 2], "%02x", hash[i]);
}
printf("original file sha256 hash : %s\n", hash_str);
return 0;
}
복제본 파일 무결성 검사 예제
이제 아래와 같이 기존 원본 파일 복제본을 누군가에게 공유하였다고 합시다. 이 공유된 파일이 진짜 원본 파일과 완전 동일한 파일인지 확인하는 프로그램을 작성해보도록 하겠습니다. 만약 정말 동일한 파일이라면 해시값이 동일하게 나와야합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
int main() {
char filename[1024];
char expected_hash[65];
unsigned char hash[SHA256_DIGEST_LENGTH];
char hash_str[65];
printf("Enter the filename: ");
fgets(filename, sizeof(filename), stdin);
filename[strcspn(filename, "\n")] = 0;
printf("Enter the expected SHA-256 hash: ");
fgets(expected_hash, sizeof(expected_hash), stdin);
expected_hash[strcspn(expected_hash, "\n")] = 0;
// Open the file
FILE *file = fopen(filename, "rb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
{
// Calculate SHA-256 hash
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);
}
// Convert the hash to a string
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
sprintf(&hash_str[i * 2], "%02x", hash[i]);
}
// Compare calculated hash with expected hash
if (strcmp(hash_str, expected_hash) == 0) {
printf("File integrity verified.\n");
} else {
printf("File integrity verification failed.\n");
}
return 0;
}
결과확인
아래와 같이 파일 배포자는 원본 파일의 해시값을 알고 있고 복제본 파일을 해시한 값과 비교하면 파일이 변경되었는지 알 수 있습니다.