반응형
윈도우에서 파일  MD5 해쉬값 구하기

요즘은 MD5를 많이 사용하죠? 

특히 인터넷에서 파일 다운로드 할때, MD5 값을 같이 표시줍니다.

 

원본 파일과 MD5을 표시하고, 다운로드 한 파일에 대해서 MD5 체크해서 변경된 내용이 확인하기 위해서 사용합니다.

파일 다운로드 도중에 손상이 발생한 경우도 있지만, 원본 파일이 다른 파일을 다운로드 하게끔 하는 사이트들도 종종 있습니다. 이럴때 원본 파일의 MD5 비교해서 변경이 없는지 확인 가능합니다.

 

CertUtil

윈도우에 있는 CertUtil 파일을 이용하여 MD5 확인 할 수 있습니다.

 

CertUtil -hashfile -?

명령어로 사용법을 확인 가능합니다.

사용법:
  CertUtil [옵션] -hashfile InFile [HashAlgorithm]
  파일에 암호화 해시 생성 및 표시

옵션:
  -Unicode          -- 리디렉션된 출력을 유니코드로 씁니다.
  -gmt              -- GMT로 시간 표시
  -seconds          -- 시간을 초와 밀리초로 표시
  -v                -- 자세한 정보 표시 작동
  -privatekey       -- 암호 및 개인 키 데이터 표시
  -pin PIN                  -- 스마트 카드 PIN
  -sid WELL_KNOWN_SID_TYPE  -- 숫자 SID
            22 -- 로컬 시스템
            23 -- 로컬 서비스
            24 -- 네트워크 서비스

해시 알고리즘: MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512

CertUtil -?              -- 동사 목록(명령 목록)을 표시합니다.
CertUtil -hashfile -?    -- "hashfile" 동사의 도움말 텍스트를 표시합니다.
CertUtil -v -?           -- 모든 동사의 도움말 텍스트를 모두 표시합니다.

 

사용 방법>  CertUtil -hashfile <filename> MD5

예> CertUtil -hashfile MD5_test.txt MD5

 

 

커맨드창에서 확인한 결과 입니다.

 

 

파일에서 MD5 해시 만들기 예제 소스코드

위에서는 CertUtil 이용하여 MD5 만들었다면, 아래는 샘플 소스코드 입니다.

 

예제 C 프로그램 : 파일 콘텐츠에서 MD5 해시만들기

https://learn.microsoft.com/ko-kr/windows/win32/seccrypto/example-c-program--creating-an-md-5-hash-from-file-content

 

 

#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>

#define BUFSIZE 1024
#define MD5LEN  16

DWORD main()
{
    DWORD dwStatus = 0;
    BOOL bResult = FALSE;
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    HANDLE hFile = NULL;
    BYTE rgbFile[BUFSIZE];
    DWORD cbRead = 0;
    BYTE rgbHash[MD5LEN];
    DWORD cbHash = 0;
    CHAR rgbDigits[] = "0123456789abcdef";
    LPCWSTR filename=L"filename.txt";
    // Logic to check usage goes here.

    hFile = CreateFile(filename,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_SEQUENTIAL_SCAN,
        NULL);

    if (INVALID_HANDLE_VALUE == hFile)
    {
        dwStatus = GetLastError();
        printf("Error opening file %s\nError: %d\n", filename, 
            dwStatus); 
        return dwStatus;
    }

    // Get handle to the crypto provider
    if (!CryptAcquireContext(&hProv,
        NULL,
        NULL,
        PROV_RSA_FULL,
        CRYPT_VERIFYCONTEXT))
    {
        dwStatus = GetLastError();
        printf("CryptAcquireContext failed: %d\n", dwStatus); 
        CloseHandle(hFile);
        return dwStatus;
    }

    if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
    {
        dwStatus = GetLastError();
        printf("CryptAcquireContext failed: %d\n", dwStatus); 
        CloseHandle(hFile);
        CryptReleaseContext(hProv, 0);
        return dwStatus;
    }

    while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, 
        &cbRead, NULL))
    {
        if (0 == cbRead)
        {
            break;
        }

        if (!CryptHashData(hHash, rgbFile, cbRead, 0))
        {
            dwStatus = GetLastError();
            printf("CryptHashData failed: %d\n", dwStatus); 
            CryptReleaseContext(hProv, 0);
            CryptDestroyHash(hHash);
            CloseHandle(hFile);
            return dwStatus;
        }
    }

    if (!bResult)
    {
        dwStatus = GetLastError();
        printf("ReadFile failed: %d\n", dwStatus); 
        CryptReleaseContext(hProv, 0);
        CryptDestroyHash(hHash);
        CloseHandle(hFile);
        return dwStatus;
    }

    cbHash = MD5LEN;
    if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
    {
        printf("MD5 hash of file %s is: ", filename);
        for (DWORD i = 0; i < cbHash; i++)
        {
            printf("%c%c", rgbDigits[rgbHash[i] >> 4],
                rgbDigits[rgbHash[i] & 0xf]);
        }
        printf("\n");
    }
    else
    {
        dwStatus = GetLastError();
        printf("CryptGetHashParam failed: %d\n", dwStatus); 
    }

    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 0);
    CloseHandle(hFile);

    return dwStatus; 
}

 

위에 CertUtil 유틸과 예제 코드로 동일한 결과가 나오는걸 확인했습니다.

 

 

 

반응형

'코드' 카테고리의 다른 글

nosstarter.npe (nProtect) 삭제하기  (0) 2023.08.29
티스토리, 접속오류 HTTP ERROR 400  (0) 2023.07.10
AnyTxt 설치 및 설정 방법  (0) 2023.06.07
대용량 파일 복사 - TeraCopy  (0) 2023.05.22
윈도우 10 설치 USB 만들기  (0) 2023.05.16

+ Recent posts