본문 바로가기
Development/Etc

[Etc] Windows에서 해시(Hash)로 파일 비교하는 방법 총정리

by 은스타 2023. 1. 25.
반응형

Windows에서 해시(Hash)로 파일 비교하는 방법 총정리: 명령어부터 GUI 도구까지

안녕하세요.

이번 포스팅에서는 파일의 무결성을 확인하거나 두 파일이 정확히 동일한지 확인해야 할 때가 있습니다. 이럴 때 해시(Hash) 값을 비교하면 빠르고 정확하게 판단할 수 있습니다. 특히 Windows 환경에서 해시를 사용한 파일 비교는 매우 실용적이며, 다양한 방법으로 수행할 수 있습니다. 이 글에서는 Windows에서 해시로 파일을 비교하는 모든 방법을 상세히 알아보겠습니다.


목차

  1. 해시(Hash)란 무엇인가?
  2. Windows 내장 명령어로 해시 비교하기
  3. PowerShell을 이용한 해시 비교
  4. Windows용 써드파티 해시 비교 도구
  5. 프로그래밍 언어를 이용한 해시 비교
  6. 다양한 해시 알고리즘 비교
  7. 해시 비교 시 주의사항
  8. 자주 묻는 질문(FAQ)

 

#1. 해시(Hash)란 무엇인가?

해시는 임의의 크기를 가진 데이터로부터 고정된 크기의 값을 생성하는 알고리즘입니다. 파일의 해시 값은 해당 파일의 '디지털 지문'이라고 할 수 있으며, 파일 내용이 조금이라도 변경되면 해시 값도 완전히 달라집니다.

해시의 주요 특징

  • 고유성: 서로 다른 파일은 (충돌 가능성이 매우 낮은) 서로 다른 해시 값을 가집니다.
  • 결정성: 동일한 파일은 항상 동일한 해시 값을 생성합니다.
  • 효율성: 파일 크기와 관계없이 빠르게 계산할 수 있습니다.
  • 불가역성: 해시 값으로부터 원본 데이터를 복원할 수 없습니다.

주요 해시 알고리즘

  • MD5: 128비트 해시 값 (16바이트)
  • SHA-1: 160비트 해시 값 (20바이트)
  • SHA-256: 256비트 해시 값 (32바이트)
  • SHA-512: 512비트 해시 값 (64바이트)

 

#2. Windows 내장 명령어로 해시 비교하기

Windows 10 및 Windows 11에서는 certutil 명령어를 사용하여 파일의 해시 값을 쉽게 확인할 수 있습니다.

CertUtil 명령어 사용하기

명령 프롬프트(cmd)를 관리자 권한으로 실행하고 다음 명령어를 입력합니다:

certutil -hashfile [파일경로] [해시알고리즘]

예를 들어, example.txt 파일의 SHA-256 해시를 확인하려면:

certutil -hashfile C:\path\to\example.txt SHA256

두 파일 비교하기

두 파일의 해시 값을 각각 계산한 후 비교합니다:

certutil -hashfile file1.txt SHA256
certutil -hashfile file2.txt SHA256

출력된 해시 값이 동일하면 두 파일의 내용이 같은 것입니다.

일괄 비교를 위한 배치 파일 만들기

여러 파일을 비교해야 할 경우, 다음과 같은 배치 파일을 만들어 사용할 수 있습니다:

@echo off
echo Comparing hashes for %1 and %2
echo.
echo File 1: %1
certutil -hashfile "%1" SHA256 | findstr /v "hash"
echo.
echo File 2: %2
certutil -hashfile "%2" SHA256 | findstr /v "hash"

이 파일을 compare_hash.bat로 저장한 후, 다음과 같이 실행합니다:

compare_hash.bat file1.txt file2.txt

 

#3. PowerShell을 이용한 해시 비교

PowerShell은 더 강력한 해시 비교 기능을 제공합니다. Windows 7 이상에서는 기본적으로 설치되어 있습니다.

Get-FileHash 명령어 사용하기

PowerShell에서 다음 명령어를 사용하여 파일의 해시 값을 확인합니다:

Get-FileHash -Path [파일경로] -Algorithm [해시알고리즘]

예를 들어:

Get-FileHash -Path C:\path\to\example.txt -Algorithm SHA256

두 파일 비교하기

PowerShell에서 두 파일의 해시를 비교하는 간단한 스크립트:

$hash1 = (Get-FileHash -Path "file1.txt" -Algorithm SHA256).Hash
$hash2 = (Get-FileHash -Path "file2.txt" -Algorithm SHA256).Hash

if ($hash1 -eq $hash2) {
    Write-Host "Files are identical" -ForegroundColor Green
} else {
    Write-Host "Files are different" -ForegroundColor Red
}

폴더 내 모든 파일 해시 비교

폴더 내 모든 파일의 해시 값을 계산하는 PowerShell 스크립트:

$folder1 = "C:\Folder1"
$folder2 = "C:\Folder2"

$files1 = Get-ChildItem -Path $folder1 -File
$files2 = Get-ChildItem -Path $folder2 -File

foreach ($file1 in $files1) {
    $file2 = Join-Path -Path $folder2 -ChildPath $file1.Name

    if (Test-Path $file2) {
        $hash1 = (Get-FileHash -Path $file1.FullName -Algorithm SHA256).Hash
        $hash2 = (Get-FileHash -Path $file2 -Algorithm SHA256).Hash

        if ($hash1 -eq $hash2) {
            Write-Host "$($file1.Name): Identical" -ForegroundColor Green
        } else {
            Write-Host "$($file1.Name): Different" -ForegroundColor Red
        }
    } else {
        Write-Host "$($file1.Name): Not found in second folder" -ForegroundColor Yellow
    }
}

이 스크립트를 CompareFolder.ps1로 저장하고 PowerShell에서 실행하면 두 폴더 간의 파일을 비교할 수 있습니다.

 

#4. Windows용 써드파티 해시 비교 도구

GUI 기반의 써드파티 도구를 사용하면 더 편리하게 해시 비교를 할 수 있습니다.

1. HashMyFiles

NirSoft에서 제공하는 무료 도구로, 여러 파일의 해시 값을 한 번에 계산하고 비교할 수 있습니다.

주요 기능:

  • 여러 해시 알고리즘 지원 (MD5, SHA1, SHA-256 등)
  • 파일 크기와 수정 날짜 표시
  • 색상 코드로 중복 파일 표시
  • 결과를 다양한 형식으로 내보내기

HashMyFiles 다운로드

2. HashTab

파일 속성에 해시 값을 표시하는 쉘 확장 프로그램입니다.

사용 방법:

  1. HashTab 설치
  2. 파일을 마우스 오른쪽 버튼으로 클릭하고 "속성" 선택
  3. "파일 해시" 탭에서 해시 값 확인
  4. "설정" 버튼을 클릭하여 사용할 해시 알고리즘 선택

HashTab 다운로드

3. MD5 & SHA Checksum Utility

직관적인 인터페이스를 제공하는 무료 도구입니다.

주요 기능:

  • 파일 드래그 앤 드롭 지원
  • MD5, SHA-1, SHA-256, SHA-384, SHA-512 지원
  • 해시 값 복사 및 저장 기능

MD5 & SHA Checksum Utility 다운로드

4. QuickHash GUI

오픈 소스 크로스 플랫폼 해시 계산 및 비교 도구입니다.

주요 기능:

  • 파일, 텍스트, 폴더 비교 지원
  • 다양한 해시 알고리즘 지원
  • 대용량 파일 처리 가능

QuickHash GUI 다운로드

 

#5. 프로그래밍 언어를 이용한 해시 비교

프로그래밍에 익숙하다면, 다양한 언어로 해시 비교 기능을 구현할 수 있습니다.

Python을 이용한 해시 비교

import hashlib

def calculate_hash(filename, algorithm='sha256'):
    """파일의 해시 값을 계산합니다."""
    hash_obj = hashlib.new(algorithm)

    with open(filename, 'rb') as f:
        # 파일을 청크 단위로 읽어 메모리 효율성 높임
        for chunk in iter(lambda: f.read(4096), b''):
            hash_obj.update(chunk)

    return hash_obj.hexdigest()

def compare_files(file1, file2, algorithm='sha256'):
    """두 파일의 해시 값을 비교합니다."""
    hash1 = calculate_hash(file1, algorithm)
    hash2 = calculate_hash(file2, algorithm)

    print(f"File 1 ({file1}): {hash1}")
    print(f"File 2 ({file2}): {hash2}")

    if hash1 == hash2:
        print("Files are identical.")
    else:
        print("Files are different.")

    return hash1 == hash2

# 사용 예시
compare_files('file1.txt', 'file2.txt')

C#을 이용한 해시 비교

using System;
using System.IO;
using System.Security.Cryptography;

class Program
{
    static string CalculateHash(string filePath, HashAlgorithm hashAlgorithm)
    {
        using (FileStream stream = File.OpenRead(filePath))
        {
            byte[] hash = hashAlgorithm.ComputeHash(stream);
            return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
        }
    }

    static bool CompareFiles(string file1, string file2)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            string hash1 = CalculateHash(file1, sha256);
            string hash2 = CalculateHash(file2, sha256);

            Console.WriteLine($"File 1 ({file1}): {hash1}");
            Console.WriteLine($"File 2 ({file2}): {hash2}");

            bool areIdentical = hash1.Equals(hash2);
            Console.WriteLine(areIdentical ? "Files are identical." : "Files are different.");

            return areIdentical;
        }
    }

    static void Main(string[] args)
    {
        if (args.Length >= 2)
        {
            CompareFiles(args[0], args[1]);
        }
        else
        {
            Console.WriteLine("Usage: Program.exe <file1> <file2>");
        }
    }
}

 

#6. 다양한 해시 알고리즘 비교

파일 비교에 사용되는 주요 해시 알고리즘의 특성을 비교해보겠습니다.

No 알고리즘 해시 길이 속도 충돌 저항성 보안성 권장 용도
1 MD5 128비트 매우 빠름 낮음 매우 낮음 간단한 무결성 확인 (보안 용도로는 권장하지 않음)
2 SHA-1 160비트 빠름 중간 낮음 비보안 목적의 파일 비교
3 SHA-256 256비트 중간 높음 높음 일반적인 파일 무결성 검증, 보안 용도
4 SHA-512 512비트 느림 매우 높음 매우 높음 높은 보안이 요구되는 상황

어떤 알고리즘을 선택해야 할까?

  • 간단한 파일 비교: SHA-256이 속도와 보안성의 균형이 좋습니다.
  • 대용량 파일 비교: 속도가 중요하다면 SHA-1이나 MD5를 고려할 수 있으나, 충돌 가능성을 염두에 두어야 합니다.
  • 보안이 중요한 상황: SHA-256 이상의 알고리즘을 권장합니다.
  • 암호화 관련 용도: SHA-512와 같은 강력한 알고리즘을 사용하세요.

 

#7. 해시 비교 시 주의사항

해시를 사용하여 파일을 비교할 때 주의해야 할 사항들입니다.

1. 파일 인코딩과 줄 바꿈 문자

텍스트 파일의 경우, 인코딩(UTF-8, ANSI 등)과 줄 바꿈 문자(CRLF, LF)가 다르면 내용이 동일해 보여도 해시 값이 달라질 수 있습니다.

2. 숨겨진 바이트

일부 파일에는 BOM(Byte Order Mark)이나 메타데이터와 같은 눈에 보이지 않는 바이트가 포함될 수 있으며, 이로 인해 해시 값이 달라질 수 있습니다.

3. 대용량 파일 처리

대용량 파일의 해시를 계산할 때는 메모리 사용량에 주의해야 합니다. 파일을 청크 단위로 읽어 해시를 계산하는 방법을 사용하세요.

4. 해시 충돌 가능성

해시 충돌(서로 다른 두 파일이 같은 해시 값을 가지는 현상)은 이론적으로 가능하지만, SHA-256과 같은 강력한 알고리즘을 사용하면 실질적으로 발생 가능성이 매우 낮습니다.

 

#8. 자주 묻는 질문(FAQ)

Q: 파일 크기가 다른데도 해시 값이 같을 수 있나요?

A: 이론적으로는 가능하나, 실제로는 거의 발생하지 않습니다. 파일 크기가 다르면 해시 값도 다를 확률이 매우 높습니다.

Q: 해시 비교가 바이너리 비교보다 좋은 점은 무엇인가요?

A: 해시 비교는 전체 파일을 메모리에 로드할 필요가 없어 대용량 파일 처리에 효율적이며, 파일이 같은지 여부만 확인하면 되는 경우 더 빠릅니다.

Q: 어떤 해시 알고리즘이 가장 안전한가요?

A: 현재 SHA-256 이상의 알고리즘이 보안상 안전하다고 간주됩니다. MD5와 SHA-1은 보안 목적으로는 권장되지 않습니다.

Q: 온라인에서 해시를 확인할 수 있는 방법이 있나요?

A: 여러 온라인 도구가 있지만, 민감한 파일은 인터넷에 업로드하지 않는 것이 좋습니다. 로컬 도구 사용을 권장합니다.

Q: 어떤 상황에서 해시 비교가 유용한가요?

A:

  • 다운로드한 파일의 무결성 확인
  • 백업 파일이 원본과 동일한지 확인
  • 같은 파일의 여러 복사본 식별
  • 파일이 변조되었는지 확인

결론

Windows에서 해시를 사용하여 파일을 비교하는 방법은 다양합니다. 명령 프롬프트의 certutil, PowerShell의 Get-FileHash, 써드파티 GUI 도구, 또는 직접 작성한 스크립트 등 상황에 맞는 방법을 선택하여 사용할 수 있습니다.

파일 비교를 위해 해시를 사용하면 크기에 상관없이 빠르고 정확하게 파일의 동일성을 확인할 수 있으며, 특히 대용량 파일이나 많은 수의 파일을 비교할 때 매우 유용합니다.

안전한 해시 비교를 위해서는 SHA-256과 같은 검증된 알고리즘을 사용하고, 파일 인코딩이나 줄 바꿈 문자와 같은 잠재적인 차이 요소를 고려해야 합니다.

이 글에서 소개한 다양한 방법들을 활용하여 Windows 환경에서 효율적으로 파일을 비교하고 무결성을 확인하시기 바랍니다.


참고 자료:

  • Microsoft 공식 문서: PowerShell Get-FileHash
  • NirSoft HashMyFiles 공식 사이트
  • 해시 알고리즘 보안 권장 사항 (NIST)
반응형