수 GB 짜리 모델 파일이나 설치 미디어를 다른 서버로 옮긴 뒤, 제대로 갔는지 확인해야 한다. 크기만 같아도 내용이 다를 수 있으므로 내용을 요약한 값을 비교한다.
md5sum bigfile.tar.gz
sha256sum bigfile.tar.gz
옮긴 쪽과 받은 쪽에서 각각 돌려 값이 같으면 된다. 여러 파일을 한꺼번에 검증하려면 목록을 만들어 두고 검사한다.
# 보내는 쪽
sha256sum *.tar.gz > SHA256SUMS
# 받는 쪽 — 목록 파일을 함께 옮긴 뒤
sha256sum -c SHA256SUMS
-c 는 항목마다 OK 또는 FAILED 를 찍고, 하나라도 실패하면 종료 코드가 0 이 아니다. 스크립트에서는 이 종료 코드를 본다.
디렉터리 전체를 비교하려면 목록을 재귀로 만든다.
find . -type f -exec sha256sum {} + | sort -k2 > /tmp/local.sha256
md5sum 명령은 없다. 기본 제공 도구는 certutil 이다.
certutil -hashfile C:\temp\bigfile.tar.gz MD5
certutil -hashfile C:\temp\bigfile.tar.gz SHA256
PowerShell 쪽이 다루기 편하다.
Get-FileHash -Algorithm SHA256 C:\temp\bigfile.tar.gz
Get-ChildItem C:\temp\*.tar.gz | Get-FileHash -Algorithm SHA256 |
Select-Object Hash, Path
두 값을 비교할 때는 대소문자를 맞춘다. certutil 은 소문자, Get-FileHash 는 대문자로 낸다.
(Get-FileHash -Algorithm SHA256 .\a.tar.gz).Hash.ToLower()
| 용도 | 권장 |
|---|---|
| 전송 오류 확인 | MD5 도 충분하다. 빠르다 |
| 배포본 무결성·보안 검증 | SHA-256 이상 |
| 대용량을 빠르게 비교만 | xxhsum, b3sum 같은 비암호학적 해시 |
MD5 는 충돌을 의도적으로 만들 수 있으므로, 누군가 파일을 바꿔치기했을 가능성을 배제해야 하는 자리에서는 쓰지 않는다. 단순히 전송 중 깨졌는지 보는 용도라면 문제없다.
형식 자체가 검사값을 들고 있으므로 무결성만 볼 목적이면 풀어 보는 것으로 충분하다.
gzip -t bigfile.tar.gz
tar -tzf bigfile.tar.gz > /dev/null
unzip -t bigfile.zip
rsync 는 전송 후 블록 단위로 검증하며, --checksum 을 주면 크기·시각이 아니라 내용으로 비교한다. 느리지만 확실하다.
rsync -av --checksum bigfile.tar.gz user@dest:/data/
scp 는 SSH 위에서 돌아 무결성 보호를 받는다. 전송이 끝까지 성공했다면 내용이 조용히 뒤집힐 가능성은 낮다. 문제는 대개 중간에 끊긴 뒤 부분 파일이 남는 것이므로, 크기와 체크섬을 함께 본다.
체크섬 값 자체를 신뢰할 수 없으면 검증이 의미가 없다. 배포처에서 받은 해시는 파일과 다른 경로로 받고, 가능하면 서명된 목록을 쓴다.
거대한 파일을 해시하면 시간이 걸린다. 수십 GB 를 여러 번 돌릴 바에는 전송 도구의 검증 기능을 켜는 편이 낫다.
텍스트 파일을 윈도우와 리눅스 사이에서 옮기면 줄 끝 문자가 바뀌어 해시가 달라질 수 있다. 바이너리 모드로 옮겼는지 확인한다.