Windows에서 해시(Hash)로 파일 비교하는 방법 총정리: 명령어부터 GUI 도구까지
안녕하세요.
이번 포스팅에서는 파일의 무결성을 확인하거나 두 파일이 정확히 동일한지 확인해야 할 때가 있습니다. 이럴 때 해시(Hash) 값을 비교하면 빠르고 정확하게 판단할 수 있습니다. 특히 Windows 환경에서 해시를 사용한 파일 비교는 매우 실용적이며, 다양한 방법으로 수행할 수 있습니다. 이 글에서는 Windows에서 해시로 파일을 비교하는 모든 방법을 상세히 알아보겠습니다.
목차
- 해시(Hash)란 무엇인가?
- Windows 내장 명령어로 해시 비교하기
- PowerShell을 이용한 해시 비교
- Windows용 써드파티 해시 비교 도구
- 프로그래밍 언어를 이용한 해시 비교
- 다양한 해시 알고리즘 비교
- 해시 비교 시 주의사항
- 자주 묻는 질문(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 등)
- 파일 크기와 수정 날짜 표시
- 색상 코드로 중복 파일 표시
- 결과를 다양한 형식으로 내보내기
2. HashTab
파일 속성에 해시 값을 표시하는 쉘 확장 프로그램입니다.
사용 방법:
- HashTab 설치
- 파일을 마우스 오른쪽 버튼으로 클릭하고 "속성" 선택
- "파일 해시" 탭에서 해시 값 확인
- "설정" 버튼을 클릭하여 사용할 해시 알고리즘 선택
3. MD5 & SHA Checksum Utility
직관적인 인터페이스를 제공하는 무료 도구입니다.
주요 기능:
- 파일 드래그 앤 드롭 지원
- MD5, SHA-1, SHA-256, SHA-384, SHA-512 지원
- 해시 값 복사 및 저장 기능
MD5 & SHA Checksum Utility 다운로드
4. 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)
'Development > Etc' 카테고리의 다른 글
[Etc] Git에서 HEAD 의미 (0) | 2022.09.28 |
---|---|
[Etc] 웹사이트 주소로 IP 주소 알아내는 방법 총정리 (0) | 2020.04.08 |
[ETC] JWT 완벽 가이드 : 개념부터 실적 적용까지 (0) | 2019.09.11 |
[Etc] CBOR 완벽 가이드 : 효율적인 데이터 교환 형식의 모든 것 (0) | 2019.03.12 |
[Etc] CDN 완벽 가이드 : 개념부터 실전 적용까지 (0) | 2016.03.23 |