스크립트·파일 자동화

파일 복사 전후 SHA-256을 비교해 내용 확인하기

이름이나 크기만으로 판단하지 않고 파일 바이트의 해시를 비교해 복사 결과를 점검합니다.

목차 보기

이런 분께복사한 문서가 원본과 같은 내용인지 확인하고 싶은 Python 입문자

준비사항
  • Python 3.12 이상을 준비하세요. 추가 패키지는 필요 없습니다.
  • ZIP을 새 폴더에 풀고 example.py, original.txt, copy.txt를 함께 두세요.
  • 동봉된 가상 텍스트 파일로 먼저 실습하세요. 읽는 동안 파일을 수정하지 마세요.

01파일 이름 대신 바이트 비교하기

파일 이름과 크기가 같아도 내용은 다를 수 있습니다. SHA-256은 파일 바이트를 읽어 64자리 16진수 문자열을 계산합니다. 같은 바이트는 같은 해시를 만들므로 복사 전후 점검에 사용할 수 있습니다.

이 실습은 두 파일의 해시가 같은지 보고서에 남깁니다. 파일을 삭제하거나 교체하지 않습니다. 해시가 같다는 결과만으로 작성자, 공식 배포 여부 또는 악성코드가 없다는 사실을 알 수는 없습니다.

02동봉 파일 확인하기

original.txt와 copy.txt에는 같은 가상 문장 한 줄이 들어 있습니다. example.py는 자신의 위치를 기준으로 두 파일을 찾아 읽습니다. 터미널의 현재 폴더가 달라도 입력 경로는 동일합니다.

text
Worknote synthetic file comparison sample.

텍스트가 화면에서 같아 보여도 줄바꿈 방식, 문자 인코딩, 끝의 공백이 다르면 바이트와 해시는 달라질 수 있습니다. 텍스트를 정리하거나 공백을 지우지 않고 그대로 비교합니다.

03첫 비교 실행하기

bash
python example.py

새 outputs 폴더와 comparison.json이 생성됩니다. 콘솔의 same_sha256=true는 동봉된 두 파일의 해시가 일치했다는 뜻입니다. 이미 outputs가 있으면 덮어쓰지 않고 멈춥니다. 재실행할 때는 다른 폴더에 예제를 새로 풀어 주세요.

04보고서에서 확인할 값

의미
algorithm사용한 해시 알고리즘 SHA-256
files비교한 두 파일의 이름
sha256각 파일의 64자리 해시 문자열
same_sha256두 해시가 같으면 true, 다르면 false

파일 이름의 순서와 해시의 순서는 같습니다. 동봉 예제에서는 true를 기대합니다. 보고서 파일이 만들어졌다는 사실과 비교 결과가 true라는 사실은 다르므로 값을 직접 확인하세요.

05코드의 핵심과 전체 예제

digest 함수는 파일을 바이너리 읽기 모드로 열고 1 MiB씩 읽어 해시 상태를 갱신합니다. 파일 전체를 한 번에 메모리에 올리지 않습니다. 두 입력을 모두 읽은 뒤에만 결과 폴더를 만듭니다.

example.py
"""Compare two local synthetic files without changing them."""
import hashlib
import json
from pathlib import Path

BASE = Path(__file__).resolve().parent

def digest(path):
    value = hashlib.sha256()
    with path.open('rb') as stream:
        for chunk in iter(lambda: stream.read(1024 * 1024), b''):
            value.update(chunk)
    return value.hexdigest()

def main():
    output = BASE / 'outputs'
    if output.exists():
        raise ValueError('outputs already exists; choose a fresh extraction folder.')
    left, right = BASE / 'original.txt', BASE / 'copy.txt'
    hashes = [digest(left), digest(right)]
    result = {'algorithm': 'SHA-256', 'files': [left.name, right.name],
              'sha256': hashes, 'same_sha256': hashes[0] == hashes[1]}
    output.mkdir(exist_ok=False)
    with (output / 'comparison.json').open('x', encoding='utf-8') as stream:
        json.dump(result, stream, indent=2)
        stream.write('\n')
    print('same_sha256=' + str(result['same_sha256']).lower())
    print('Created outputs/comparison.json')

if __name__ == '__main__':
    try:
        main()
    except (OSError, ValueError) as error:
        raise SystemExit(f'Stopped: {error}') from error

06다른 내용도 구분하는지 확인하기

  1. 새 폴더에 ZIP을 다시 풀어 첫 결과와 분리하세요.
  2. copy.txt의 sample을 Sample로 바꾸고 저장하세요.
  3. python example.py를 실행하세요.
  4. same_sha256=false인지 확인하고 두 해시를 비교하세요.

글자 수를 그대로 유지해도 한 바이트가 바뀌면 해시 비교로 차이를 확인할 수 있습니다. 일치하지 않는 원인이 손상인지, 의도적인 편집인지까지 이 코드가 판단해 주지는 않습니다.

07멈췄을 때 확인하기

파일이 없거나 읽을 수 없으면 Stopped 메시지와 함께 종료합니다. 압축을 일부만 풀지 않았는지, 파일명이 맞는지 확인하세요. 기존 outputs 오류라면 다른 폴더에 새로 풀어 실행하세요.

디스크 쓰기 오류가 나면 새 outputs에 불완전한 보고서가 남을 수 있습니다. 완료 메시지와 JSON 내용을 확인하기 전에는 결과를 사용하지 마세요.

08해시 비교의 한계

암호학적 해시에도 이론적으로 충돌 가능성이 있으므로 수학적으로 완벽한 동일성 증명이라고 부르지 않습니다. 이 예제는 일반적인 복사 점검을 위한 작은 도구입니다. 공식 다운로드의 진위를 확인하려면 신뢰할 수 있는 배포처가 제공한 해시나 서명과 비교하는 별도 절차가 필요합니다.

읽는 동안 파일이 바뀌는 상황, 네트워크 드라이브 장애, 접근 권한과 대용량 파일의 성능은 별도 점검 대상입니다. 입력 파일에 대한 스냅샷이나 잠금을 만들지는 않습니다.

실행·검증 기록

2026-09-19 · Windows 11 · CPython 3.12.14 · 표준 라이브러리

  • 동일 파일은 true, 같은 길이의 다른 내용은 false 확인
  • 없는 입력과 기존 출력 폴더 거부 확인
  • 실행 전후 입력 SHA-256 일치 확인
검증 범위의 한계
  • 동시 수정, 디스크 오류와 네트워크 드라이브는 검증하지 않았습니다.
  • 해시 일치는 작성자나 파일 안전성의 보증이 아닙니다.

사이트 전체의 작성·검증 원칙

직접 실행할 예제 파일

코드·입력 데이터·실행 안내가 포함되어 있습니다. 압축을 풀고 README.txt부터 읽어 주세요.

예제 ZIP 다운로드

직접 작성한 연습 자료 · 원본을 따로 보관한 뒤 실행하세요.

참고 출처

설명과 예제는 직접 작성했습니다. 관련 동작과 개념은 아래 공식 자료에서 확인할 수 있습니다.