파일 무결성 확인, 해시값 비교하기
파일이 잘 열리는데도 해시값을 비교해야 할까요?
파일을 복사한 뒤 이름과 용량이 같으면 제대로 옮겨졌다고 생각하기 쉽습니다. 하지만 일부 데이터가 바뀌어도 이름과 크기는 그대로일 수 있습니다. 파일 무결성 확인은 이렇게 눈으로 구분하기 어려운 변화가 있는지 점검하는 과정입니다. 원본과 복사본에 같은 해시 알고리즘을 적용해 결과를 비교하면 내용이 같은지 판단하는 데 도움이 됩니다.
문서가 열리거나 동영상이 재생된다는 것은 해당 프로그램이 파일을 읽을 수 있다는 뜻입니다. 문서의 모든 내용이나 동영상의 끝부분까지 원본과 같다는 보장은 아닙니다. 열기·재생 검사는 실제 사용에 문제가 없는지 살펴보는 데, 해시 비교는 파일 전체의 데이터가 원본과 일치하는지 확인하는 데 쓰입니다. 중요한 파일을 옮겼다면 복사본을 열어 보고 해시값도 대조하면 좋습니다.
해시값은 파일 데이터를 일정한 규칙으로 계산한 문자열입니다. 같은 데이터에 같은 알고리즘을 적용하면 같은 값이 나오며, 내용이 조금만 바뀌어도 보통 전혀 다른 값이 나옵니다. 다만 원본 자체가 손상되어 있었다면 해시가 같아도 그 손상이 그대로 복사된 상태입니다.
비교하기 전에 무엇을 준비해야 하나요?
직접 복사한 파일은 원본과 복사본이 필요합니다. 내려받은 파일은 배포자가 공개한 기준 해시값과 대조합니다. 기준값이 없다면 현재 해시를 기록해 이후 변경 여부를 살펴볼 수는 있지만, 다운로드가 배포 원본과 일치하는지까지 확인할 수는 없습니다.
이 글에서는 SHA-256을 사용합니다. 결과는 64자리의 16진수 문자열이며, 두 파일 모두 같은 알고리즘으로 계산해야 합니다. SHA-256의 정의를 담은 공식 표준 자료는 미국 국립표준기술연구소의 FIPS 180-4, Secure Hash Standard입니다. 다른 알고리즘으로 만든 값끼리는 직접 비교하지 않습니다.
복사와 다운로드가 끝난 뒤 파일을 편집 중인 프로그램을 닫으세요. 클라우드 파일은 PC에 파일 내용이 내려받아져 있는지도 확인합니다. 계산하는 동안 파일 내용이 바뀌지 않도록 준비하면 결과를 해석하기 쉽습니다.
Windows PowerShell에서 어떻게 비교하나요?
시작 메뉴에서 PowerShell을 검색한 뒤 Windows PowerShell을 실행합니다. 파일 해시를 계산하는 명령은 Get-FileHash이며, 사용법과 매개변수 설명은 Microsoft의 Get-FileHash 공식 문서에서 참고할 수 있습니다. 이 명령은 파일을 읽어 계산하며 내용을 수정하지 않습니다.
아래 예시는 원본과 복사본이 각각 C:\FileCheck\original, C:\FileCheck\copied 폴더에 있고 이름은 모두 sample.txt인 경우입니다. 따옴표 안의 두 경로를 자신의 파일 경로로 바꾼 뒤 코드 전체를 실행하세요. 경로에 공백이 있어도 따옴표는 그대로 둡니다.
try {
$originalHash = (Get-FileHash -LiteralPath 'C:\FileCheck\original\sample.txt' -Algorithm SHA256 -ErrorAction Stop).Hash
$copiedHash = (Get-FileHash -LiteralPath 'C:\FileCheck\copied\sample.txt' -Algorithm SHA256 -ErrorAction Stop).Hash
"원본: $originalHash"
"복사본: $copiedHash"
$originalHash -eq $copiedHash
} catch {
Write-Output '해시 계산에 실패해 비교하지 않았습니다.'
Write-Output $_.Exception.Message
}
두 계산이 모두 성공하면 원본과 복사본의 해시값이 출력되고, 그 아래에 비교 결과가 나옵니다. True는 두 값이 같다는 뜻이고 False는 다르다는 뜻입니다. 눈으로 앞뒤 몇 글자만 확인하는 대신 -eq가 전체 문자열을 비교하도록 하는 방식입니다.
각 계산의 -ErrorAction Stop은 오류가 발생하면 실행을 중단하고 catch로 넘어가게 합니다. 따라서 파일을 찾을 수 없거나 읽을 권한이 없으면 해시 비교를 수행하지 않습니다. 오류가 표시되면 경로와 파일 상태를 바로잡고 코드 전체를 다시 실행하세요. 큰 파일은 계산에 시간이 걸리므로 결과가 나올 때까지 옮기거나 수정하지 않습니다.
이름과 크기가 같은 파일도 구분되나요?
전송 전후를 대조하는 가상 예시를 살펴보겠습니다. 원본 폴더의 sample.txt에는 ABCD, 전송받은 폴더의 sample.txt에는 ABCE가 들어 있다고 가정합니다. 두 파일 모두 줄바꿈과 BOM 없이 ASCII 문자 네 개만 저장했다면 각각 4바이트입니다. BOM은 문자 인코딩을 표시하기 위해 파일 앞에 붙을 수 있는 데이터입니다.
이 조건의 두 파일에 위 코드를 실행하면 원본과 전송받은 파일의 SHA-256 값이 다르게 나오고, 비교 결과는 False가 됩니다. 이름과 크기는 같지만 마지막 문자에 해당하는 데이터가 다르기 때문입니다. 원본을 그대로 다시 복사해 같은 코드로 계산하면 두 해시가 일치해 True가 나옵니다.
이는 실제 전송 사고를 보고한 경험담이 아니라 비교 원리를 설명하는 가상 사례입니다. 직접 시험한다면 편집기가 추가한 줄바꿈이나 저장 인코딩도 해시에 영향을 준다는 점을 기억하세요. 화면에 보이는 글자가 같아도 파일에 저장된 데이터는 다를 수 있습니다.
내려받은 파일은 어떤 기준값과 비교하나요?
공식 다운로드 페이지가 SHA-256 값을 제공한다면 내려받은 파일을 같은 알고리즘으로 계산해 대조합니다. 파일의 버전, 운영체제, 배포 형식이 기준값의 대상과 같아야 합니다. 압축 파일의 해시는 압축 파일 자체에 적용하며, 압축을 푼 내부 문서의 해시와 비교하지 않습니다. 기준값은 64자리 전체를 확인하세요.
해시값이 같다는 사실만으로 파일이 안전하거나 배포자가 진짜라고 보장되지는 않습니다. 파일과 기준값이 함께 바뀌어 배포되면 해시 비교만으로 이를 알아내기 어렵습니다. 기준값을 공식 배포처처럼 신뢰할 수 있는 경로에서 확인해야 하는 이유입니다. 해시 비교는 악성코드 검사나 배포자 확인을 대신하지 않습니다.
해시값이 다르면 무엇부터 확인하나요?
원본을 지우거나 복사본으로 덮어쓰지 말고 두 파일을 유지하세요. 같은 버전인지, 같은 알고리즘을 사용했는지, 복사 후 편집하거나 다시 저장하지 않았는지 차례로 확인합니다. 파일 이름만 바꾸는 것은 내용 해시에 영향을 주지 않지만, 문서를 다시 저장하면 내부 데이터가 달라질 수 있습니다. 해시 차이만으로 어느 쪽이 잘못되었는지나 변경 원인을 알 수는 없습니다.
의도한 변경이 없었다면 별도 폴더로 다시 복사한 뒤 비교합니다. 다운로드 파일은 신뢰할 수 있는 배포처에서 다시 받아 기준값과 대조하세요. 반복해서 값이 다르면 오류 메시지와 전송 경로를 기록하고 저장장치나 연결 상태를 점검합니다.
확인이 끝나면 메모 한 곳에 원본·복사본 경로, SHA-256 값, 확인 날짜를 남겨 두세요. 내려받은 파일이라면 기준값을 가져온 페이지 주소도 함께 적습니다. 복잡한 분류 체계를 만들기보다 어느 파일을 어떤 기준으로 확인했는지 다시 찾을 수 있는 간단한 기록이면 충분합니다.