목차
- C openssl 라이브러리 활용 개발 환경 구성 이전 포스팅
- sha256 해시 관련 예제 이전 포스팅
- opendir 특정 디렉토리 내의 모든 파일 출력 예제 이전 포스팅
- 특정 디렉토리 내의 모든 파일 구하기 예제
- 모든 파일의 SHA256 해시 값 구하기 예제
C openssl 라이브러리 활용 개발 환경 구성 이전 포스팅
오늘 포스팅에서는 특정 디렉토리 안에 있는 모든 파일의 SHA 256 해시 값을 출력하는 예제를 진행해보겠습니다. 이를 위해서는 openssl 라이브러리 연동이 반드시 필요합니다. C 언어로 openssl 라이브러리를 사용할 수 있도록 개발 환경을 구성해주세요. 아래 링크를 참고하면 구성이 가능합니다.
2023.07.28 - [C] - [C/C++] Openssl 정적 라이브러리 빌드 및 Codelite 설치, 개발 환경 구성(ubuntu, codelite)
sha256 해시 관련 예제 이전 포스팅
그리고 SHA 256 이란 단방향 암호화를 의미합니다. 따라서 아래의 이전 포스팅을 참고하여 위에서 확인한 openssl 라이브러리의 sha 256 관련 함수 사용법을 확인해주세요.
2023.07.28 - [C] - [C/C++] Openssl 활용 SHA256 해시 예제
opendir 특정 디렉토리 내의 모든 파일 출력 예제 이전 포스팅
특정 디렉토리 내의 모든 파일의 경로를 구하기 위해서는 opendir, readdir, closedir에 대한 함수 사용법을 알아야합니다. 따라서 아래의 이전 포스팅을 참고하여 C에서 특정 디렉토리 내 파일 경로를 구하는 방법을 확인해주세요. 모든 파일의 경로를 파악하여 파일을 열고 해당 데이터들을 해시할 수 있습니다.
2023.08.09 - [C] - [C/C++] 특정 디렉토리의 모든 파일 경로 출력 예제(opendir, readdir, closedir)
특정 디렉토리 내의 모든 파일 구하기 예제
자 이제 위의 포스팅에서 확인한 것과 같이 opendir과 readdir을 통해 사용자에게 입력받은 디렉토리로부터 모든 파일의 경로를 출력합니다. 이 경로들을 이용하여 sha256 해시를 진행할 예정입니다. 아래는 예제 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
void processFilesInDirectory(const char *dirPath) {
struct dirent *entry;
DIR *dir = opendir(dirPath);
if (dir == NULL) {
perror("디렉토리 열기 실패");
return;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
char filePath[256];
snprintf(filePath, sizeof(filePath), "%s/%s", dirPath, entry->d_name);
printf("%s\n", filePath);
}
}
closedir(dir);
}
int main() {
char dirPath[256];
printf("디렉토리 경로를 입력하세요: ");
scanf("%s", dirPath);
printf("\n대상 디렉토리 : %s\n\n", dirPath);
processFilesInDirectory(dirPath);
return 0;
}
모든 파일의 SHA256 해시 값 구하기 예제
위에서 구한 모든 파일의 경로를 이용하여 각각의 파일을 열고 데이터를 읽습니다. 이후 openssl의 SHA256 관련 함수를 통해 해시를 수행합니다. 아래는 예제입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <openssl/sha.h>
void calculateSHA256(const char *filePath) {
unsigned char hash[SHA256_DIGEST_LENGTH];
unsigned char buffer[1024];
size_t bytesRead;
FILE *file = fopen(filePath, "rb");
if (file == NULL) {
printf("%s 파일 열기 실패\n", filePath);
return;
}
SHA256_CTX sha256;
SHA256_Init(&sha256);
while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
SHA256_Update(&sha256, buffer, bytesRead);
}
SHA256_Final(hash, &sha256);
fclose(file);
printf("파일: %s\t\t\tSHA-256 해시값:\t", filePath);
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
printf("%02x", hash[i]);
}
printf("\n");
}
void processFilesInDirectory(const char *dirPath) {
struct dirent *entry;
DIR *dir = opendir(dirPath);
if (dir == NULL) {
perror("디렉토리 열기 실패");
return;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
char filePath[256];
snprintf(filePath, sizeof(filePath), "%s/%s", dirPath, entry->d_name);
calculateSHA256(filePath);
}
}
closedir(dir);
}
int main() {
char dirPath[256];
printf("디렉토리 경로를 입력하세요: ");
scanf("%s", dirPath);
printf("\n대상 디렉토리 : %s\n\n", dirPath);
processFilesInDirectory(dirPath);
return 0;
}