반응형
Windows에서 해시(Hash)로 파일 비교하는 명령어부터 GUI 도구까지 방법 총정리
개요
안녕하세요! 파일의 무결성을 확인하거나 두 파일이 정확히 동일한지 확인해야 할 때가 있습니다. 이럴 때 해시(Hash) 값을 비교하면 빠르고 정확하게 판단할 수 있습니다.
특히 Windows 환경에서 해시를 사용한 파일 비교는 매우 실용적이며, 다양한 방법으로 수행할 수 있습니다. 이 글에서는 Windows 내장 명령어부터 GUI 도구, 프로그래밍을 이용한 방법까지 해시로 파일을 비교하는 모든 방법을 상세히 알아보겠습니다.
특히 Windows 환경에서 해시를 사용한 파일 비교는 매우 실용적이며, 다양한 방법으로 수행할 수 있습니다. 이 글에서는 Windows 내장 명령어부터 GUI 도구, 프로그래밍을 이용한 방법까지 해시로 파일을 비교하는 모든 방법을 상세히 알아보겠습니다.

목차
1. 해시(Hash)란 무엇인가?
2. Windows 내장 명령어로 해시 비교하기
3. PowerShell을 이용한 해시 비교
4. Windows용 GUI 해시 비교 도구
5. 자주 묻는 질문(FAQ)
#1. 해시(Hash)란 무엇인가?
해시는 임의의 크기를 가진 데이터로부터 고정된 크기의 값을 생성하는 알고리즘입니다. 파일의 해시 값은 해당 파일의 '디지털 지문'이라고 할 수 있으며, 파일 내용이 조금이라도 변경되면 해시 값도 완전히 달라집니다.
1) 해시의 주요 특징
① 고유성: 서로 다른 파일은 (충돌 가능성이 매우 낮은) 서로 다른 해시 값을 가집니다.
② 결정성: 동일한 파일은 항상 동일한 해시 값을 생성합니다.
③ 효율성: 파일 크기와 관계없이 빠르게 계산할 수 있습니다.
④ 불가역성: 해시 값으로부터 원본 데이터를 복원할 수 없습니다.
② 결정성: 동일한 파일은 항상 동일한 해시 값을 생성합니다.
③ 효율성: 파일 크기와 관계없이 빠르게 계산할 수 있습니다.
④ 불가역성: 해시 값으로부터 원본 데이터를 복원할 수 없습니다.
. . . . .
2) 주요 해시 알고리즘
① MD5: 128비트 해시 값 (16바이트)
② SHA-1: 160비트 해시 값 (20바이트)
③ SHA-256: 256비트 해시 값 (32바이트) - 가장 권장
④ SHA-512: 512비트 해시 값 (64바이트)
② SHA-1: 160비트 해시 값 (20바이트)
③ SHA-256: 256비트 해시 값 (32바이트) - 가장 권장
④ SHA-512: 512비트 해시 값 (64바이트)
. . . . .
3) 해시 알고리즘 비교
| 알고리즘 | 해시 길이 | 속도 | 보안성 | 권장 용도 |
|---|---|---|---|---|
| MD5 | 128비트 | 매우 빠름 | 매우 낮음 | 간단한 무결성 확인 (보안 용도 비권장) |
| SHA-1 | 160비트 | 빠름 | 낮음 | 비보안 목적의 파일 비교 |
| SHA-256 | 256비트 | 중간 | 높음 | 일반적인 파일 무결성 검증, 보안 용도 |
| SHA-512 | 512비트 | 느림 | 매우 높음 | 높은 보안이 요구되는 상황 |
(1) 어떤 알고리즘을 선택해야 할까?
① 간단한 파일 비교: SHA-256이 속도와 보안성의 균형이 좋습니다.
② 대용량 파일 비교: 속도가 중요하다면 SHA-1이나 MD5를 고려할 수 있으나, 충돌 가능성을 염두에 두어야 합니다.
③ 보안이 중요한 상황: SHA-256 이상의 알고리즘을 권장합니다.
④ 암호화 관련 용도: SHA-512와 같은 강력한 알고리즘을 사용하세요.
② 대용량 파일 비교: 속도가 중요하다면 SHA-1이나 MD5를 고려할 수 있으나, 충돌 가능성을 염두에 두어야 합니다.
③ 보안이 중요한 상황: SHA-256 이상의 알고리즘을 권장합니다.
④ 암호화 관련 용도: SHA-512와 같은 강력한 알고리즘을 사용하세요.
#2. Windows 내장 명령어로 해시 비교하기
Windows 10 및 Windows 11에서는 certutil 명령어를 사용하여 파일의 해시 값을 쉽게 확인할 수 있습니다.
1) CertUtil 명령어 사용하기
명령 프롬프트(cmd)를 관리자 권한으로 실행하고 다음 명령어를 입력합니다:
certutil -hashfile [파일경로] [해시알고리즘]
예를 들어, example.txt 파일의 SHA-256 해시를 확인하려면:
certutil -hashfile C:\path\to\example.txt SHA256
. . . . .
2) 두 파일 비교하기
두 파일의 해시 값을 각각 계산한 후 비교합니다:
certutil -hashfile file1.txt SHA256
certutil -hashfile file2.txt SHA256
certutil -hashfile file2.txt SHA256
출력된 해시 값이 동일하면 두 파일의 내용이 같은 것입니다.
. . . . .
3) 일괄 비교를 위한 배치 파일 만들기
여러 파일을 비교해야 할 경우, 다음과 같은 배치 파일을 만들어 사용할 수 있습니다:
@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"
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 이상에서는 기본적으로 설치되어 있습니다.
1) Get-FileHash 명령어 사용하기
PowerShell에서 다음 명령어를 사용하여 파일의 해시 값을 확인합니다:
Get-FileHash -Path [파일경로] -Algorithm [해시알고리즘]
예를 들어:
Get-FileHash -Path C:\path\to\example.txt -Algorithm SHA256
. . . . .
2) 두 파일 비교하기
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
}
$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
}
. . . . .
3) 폴더 내 모든 파일 해시 비교
폴더 내 모든 파일의 해시 값을 계산하는 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
}
}
$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) 프로그래밍 언어를 이용한 해시 비교
프로그래밍에 익숙하다면, 다양한 언어로 해시 비교 기능을 구현할 수 있습니다.
(1) 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')
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')
(2) 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>");
}
}
}
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>");
}
}
}
#4. Windows용 GUI 해시 비교 도구
GUI 기반의 써드파티 도구를 사용하면 더 편리하게 해시 비교를 할 수 있습니다.
1) HashMyFiles
NirSoft에서 제공하는 무료 도구로, 여러 파일의 해시 값을 한 번에 계산하고 비교할 수 있습니다.
(1) 주요 기능
① 여러 해시 알고리즘 지원 (MD5, SHA1, SHA-256 등)
② 파일 크기와 수정 날짜 표시
③ 색상 코드로 중복 파일 표시
④ 결과를 다양한 형식으로 내보내기
② 파일 크기와 수정 날짜 표시
③ 색상 코드로 중복 파일 표시
④ 결과를 다양한 형식으로 내보내기
. . . . .
2) HashTab
파일 속성에 해시 값을 표시하는 쉘 확장 프로그램입니다.
(1) 사용 방법
① HashTab 설치
② 파일을 마우스 오른쪽 버튼으로 클릭하고 "속성" 선택
③ "파일 해시" 탭에서 해시 값 확인
④ "설정" 버튼을 클릭하여 사용할 해시 알고리즘 선택
② 파일을 마우스 오른쪽 버튼으로 클릭하고 "속성" 선택
③ "파일 해시" 탭에서 해시 값 확인
④ "설정" 버튼을 클릭하여 사용할 해시 알고리즘 선택
. . . . .
3) MD5 & SHA Checksum Utility
직관적인 인터페이스를 제공하는 무료 도구입니다.
(1) 주요 기능
① 파일 드래그 앤 드롭 지원
② MD5, SHA-1, SHA-256, SHA-384, SHA-512 지원
③ 해시 값 복사 및 저장 기능
② MD5, SHA-1, SHA-256, SHA-384, SHA-512 지원
③ 해시 값 복사 및 저장 기능
. . . . .
4) QuickHash GUI
오픈 소스 크로스 플랫폼 해시 계산 및 비교 도구입니다.
(1) 주요 기능
① 파일, 텍스트, 폴더 비교 지원
② 다양한 해시 알고리즘 지원
③ 대용량 파일 처리 가능
② 다양한 해시 알고리즘 지원
③ 대용량 파일 처리 가능
#5. 자주 묻는 질문(FAQ)
1) Q: 파일 크기가 다른데도 해시 값이 같을 수 있나요?
A: 이론적으로는 가능하나, 실제로는 거의 발생하지 않습니다. 파일 크기가 다르면 해시 값도 다를 확률이 매우 높습니다. SHA-256과 같은 강력한 알고리즘을 사용하면 충돌 가능성은 실질적으로 무시할 수 있는 수준입니다.
. . . . .
2) Q: 해시 비교가 바이너리 비교보다 좋은 점은 무엇인가요?
A: 해시 비교는 전체 파일을 메모리에 로드할 필요가 없어 대용량 파일 처리에 효율적이며, 파일이 같은지 여부만 확인하면 되는 경우 더 빠릅니다. 또한 네트워크를 통해 파일을 전송하지 않고도 해시 값만으로 파일 동일성을 확인할 수 있습니다.
. . . . .
3) Q: 어떤 해시 알고리즘이 가장 안전한가요?
A: 현재 SHA-256 이상의 알고리즘이 보안상 안전하다고 간주됩니다. MD5와 SHA-1은 충돌 공격에 취약하여 보안 목적으로는 권장되지 않습니다. 일반적인 파일 무결성 확인에는 SHA-256이 속도와 보안성의 균형이 가장 좋습니다.
. . . . .
4) Q: 온라인에서 해시를 확인할 수 있는 방법이 있나요?
A: 여러 온라인 도구가 있지만, 민감한 파일은 인터넷에 업로드하지 않는 것이 좋습니다. 개인정보나 중요한 문서는 반드시 로컬 도구를 사용하여 해시를 계산하세요.
. . . . .
5) Q: 어떤 상황에서 해시 비교가 유용한가요?
A: 해시 비교가 유용한 주요 상황:
① 다운로드한 파일의 무결성 확인: 소프트웨어 다운로드 시 제공된 해시 값과 비교
② 백업 파일이 원본과 동일한지 확인: 백업 과정에서 데이터 손실 여부 검증
③ 같은 파일의 여러 복사본 식별: 중복 파일 찾기
④ 파일이 변조되었는지 확인: 원본 해시 값과 비교하여 변경 여부 탐지
⑤ 대용량 파일 전송 검증: 네트워크를 통해 전송된 파일이 정확한지 확인
① 다운로드한 파일의 무결성 확인: 소프트웨어 다운로드 시 제공된 해시 값과 비교
② 백업 파일이 원본과 동일한지 확인: 백업 과정에서 데이터 손실 여부 검증
③ 같은 파일의 여러 복사본 식별: 중복 파일 찾기
④ 파일이 변조되었는지 확인: 원본 해시 값과 비교하여 변경 여부 탐지
⑤ 대용량 파일 전송 검증: 네트워크를 통해 전송된 파일이 정확한지 확인
. . . . .
6) Q: 텍스트 파일의 해시가 달라지는 이유는?
A: 텍스트 파일의 경우 다음과 같은 이유로 해시가 달라질 수 있습니다:
① 인코딩 차이: UTF-8, ANSI 등 인코딩이 다르면 해시 값이 달라집니다.
② 줄 바꿈 문자: Windows(CRLF)와 Unix(LF)의 줄 바꿈 문자가 다릅니다.
③ BOM(Byte Order Mark): 일부 파일에는 눈에 보이지 않는 BOM이 포함됩니다.
④ 숨겨진 메타데이터: 파일에 포함된 메타데이터가 다를 수 있습니다.
① 인코딩 차이: UTF-8, ANSI 등 인코딩이 다르면 해시 값이 달라집니다.
② 줄 바꿈 문자: Windows(CRLF)와 Unix(LF)의 줄 바꿈 문자가 다릅니다.
③ BOM(Byte Order Mark): 일부 파일에는 눈에 보이지 않는 BOM이 포함됩니다.
④ 숨겨진 메타데이터: 파일에 포함된 메타데이터가 다를 수 있습니다.
. . . . .
7) Q: 대용량 파일의 해시 계산 시 주의사항은?
A: 대용량 파일 처리 시 다음 사항을 고려하세요:
① 메모리 사용량: 파일을 청크 단위로 읽어 처리하여 메모리 부담을 줄입니다.
② 처리 시간: 대용량 파일은 해시 계산에 시간이 오래 걸릴 수 있습니다.
③ 디스크 I/O: SSD보다 HDD에서 더 오래 걸릴 수 있습니다.
④ 알고리즘 선택: 빠른 처리가 필요하면 SHA-1, 보안이 중요하면 SHA-256을 선택합니다.
① 메모리 사용량: 파일을 청크 단위로 읽어 처리하여 메모리 부담을 줄입니다.
② 처리 시간: 대용량 파일은 해시 계산에 시간이 오래 걸릴 수 있습니다.
③ 디스크 I/O: SSD보다 HDD에서 더 오래 걸릴 수 있습니다.
④ 알고리즘 선택: 빠른 처리가 필요하면 SHA-1, 보안이 중요하면 SHA-256을 선택합니다.
마무리
Windows에서 해시를 사용하여 파일을 비교하는 방법은 다양합니다. 명령 프롬프트의 certutil, PowerShell의 Get-FileHash, 써드파티 GUI 도구, 또는 직접 작성한 스크립트 등 상황에 맞는 방법을 선택하여 사용할 수 있습니다.
파일 비교를 위해 해시를 사용하면 크기에 상관없이 빠르고 정확하게 파일의 동일성을 확인할 수 있으며, 특히 대용량 파일이나 많은 수의 파일을 비교할 때 매우 유용합니다.
안전한 해시 비교를 위해서는 SHA-256과 같은 검증된 알고리즘을 사용하고, 파일 인코딩이나 줄 바꿈 문자와 같은 잠재적인 차이 요소를 고려해야 합니다.
이 글에서 소개한 다양한 방법들을 활용하여 Windows 환경에서 효율적으로 파일을 비교하고 무결성을 확인하시기 바랍니다.
파일 비교를 위해 해시를 사용하면 크기에 상관없이 빠르고 정확하게 파일의 동일성을 확인할 수 있으며, 특히 대용량 파일이나 많은 수의 파일을 비교할 때 매우 유용합니다.
안전한 해시 비교를 위해서는 SHA-256과 같은 검증된 알고리즘을 사용하고, 파일 인코딩이나 줄 바꿈 문자와 같은 잠재적인 차이 요소를 고려해야 합니다.
이 글에서 소개한 다양한 방법들을 활용하여 Windows 환경에서 효율적으로 파일을 비교하고 무결성을 확인하시기 바랍니다.
긴 글 읽어주셔서 감사합니다.
끝.
끝.
반응형
'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 |