Windows 해시 함수를 통한 파일 동일성 비교

DOS배치파일 작성 팁

사람을 특정짓는 방법에는 지문이 있습니다. 모든 사람의 지문은 유일하며 일란성 쌍둥이라도 엄마 배속에서 피부가 만들어지는 과정에서 지문 또한 서로 다른 모양으로 만들어집니다. 컴퓨터의 파일도 내용이 1바이트라도 다르다면 해시 함수의 결과 값은 다른 결과를 나타냅니다. 그래서 파일 전부를 비교해서 동일 유무를 체크하는 것보다 미리 해시 함수 결과를 구해서 비교하는게 빠를 수 있습니다. 또한 제공하는 파일이 변형되지 않았는지를 보증하기위해 해시 결과 값을 별도로 공지하여 파일을 받은 쪽에서 해시 값을 구해 비교하여 파일이 원본과 같은 지를 확인 할 수 있습니다.

해시 함수 알고리즘(Hash function Algorithm)
각 파일의 고유한 해시 값(해시 코드, 해시 체크섬이라고도 함)을 얻는 함수

해시 함수를 통한 파일 동일성 비교

해시 함수로 해시 값을 통해 같은 파일인지 아닌지를 비교, 확인하는 방법을 알아보도록 하겠습니다.

certutil -hashfile  <file path> <Hash function Algorithm>

DOS 커맨드 창이나 Powershell 커맨드 창 양쪽에서 사용할 수 있습니다.
결과로 출력된 해시값은 파일의 마지막 수정 날짜나 시간, 파일명이 다르더라도 파일의 내용 및 데이터가 완전히 동일하면 동일한 해시 값이 출력됩니다.

해시 알고리즘의 종류

Windows OS에서 사용가능한 해시 알고리즘의 종류는 다음과 같습니다. 해시 알고리즘은 꾸준히 연구되고 있으며 왼쪽이 오래된 알고리즘, 오른쪽이 최근의 알고리즘입니다.

MD2 > MD4 > MD5 > SHA1 > SHA256 > SHA384 > SHA512

테스트용 셈플 데이터 작성

메모장을 사용해 다음과 같은 내용의 sample1.txt파일을 작성합니다.

1111111111111111111
2222222222222222222
3333333333333333333

위 내용에서 하나의 문자를 고친 다음 내용을 저장합니다.

sample2.txt

1111111111111111111
222222222222222222A
3333333333333333333

다음과 같이 sample1.txt를 sample3.txt로 복제 합니다.

copy sample1.txt sample3.txt

주의) 위 파일은 마지막에 줄바꿈을 넣지 않았습니다 그리고 문자코드 ANSI로 저장되었습니다. 줄바꿈 수가 다르거나 UTF-8로 저장되었을 경우 이 글의 해시 결과 값과 다르게 출력됩니다.

MD2로 출력한 결과

C:\>certutil -hashfile sample1.txt md2
MD2의 sample.txt 해시:
847e3b53463e0cb9535d041211eb940d
CertUtil: -hashfile 명령이 성공적으로 완료되었습니다.
C:\>certutil -hashfile sample2.txt md2
MD2의 sample2.txt 해시:
547cba5ad8aade692f1e0aff9279f5bb
CertUtil: -hashfile 명령이 성공적으로 완료되었습니다.
C:\>certutil -hashfile sample3.txt md2
MD2의 sample3.txt 해시:
847e3b53463e0cb9535d041211eb940d
CertUtil: -hashfile 명령이 성공적으로 완료되었습니다.

MD4사용 예

certutil -hashfile sample1.txt md4
certutil -hashfile sample2.txt md4
certutil -hashfile sample3.txt md4

위와 같이 MD5 , SHA1 , SHA256 , SHA384 , SHA512 도 동일한 명령으로 사용할 수 있습니다. 단 최근의 알고리즘일 수록 다음 과 같이 해시 결과의 값도 길어 집니다.

C:\>certutil -hashfile sample1.txt sha512 
SHA512의 sample1.txt 해시:
0d0913ce99138c772eda0c53862ec4900f9ca8fa1aaefd7d407af96e41eeacf9bf3d037677c6542d2050c7aa7780c2d4a924ef3b52f44337d02f74d85a9a8dcb
CertUtil: -hashfile 명령이 성공적으로 완료되었습니다.

디렉토리 밑의 모든 파일의 해시 값 취득 하기

certutil -hashfile 커맨드의 대상 파일은 디렉토리 단위로 지정할 수 없기 때문에 한 번에 여러 파일의 해시 값을 취득하기 위해서 반복문을 사용할 수 있습니다.

다음 배치 스크립트를 makehashlist.bat파일로 저장하여 실행합니다.

@echo off
set LOGFILE=hashed_filelist.log
for /f "usebackq delims=" %%i in (`dir /S /B /A-D /ON *.txt`) do (
    for /f "usebackq eol=C skip=1" %%j in (`certutil -hashfile "%%i" md5`) do (
      echo "%%i" %%j >> %LOGFILE%
    )
)

실행 결과 생성되는 hashed_filelist.log내용은 다음과 같습니다.

"C:\Temp\sample1.txt" 10286cc48f431473b390fbe6f7b769bf 
"C:\Temp\sample2.txt" 5f590febe4e9ddce9208b086d8837656 
"C:\Temp\sample3.txt" 10286cc48f431473b390fbe6f7b769bf 
제목과 URL을 복사했습니다