[EXT-006][기초] SHA-256으로 파일이 같은지 확인하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[EXT-006][기초] SHA-256으로 파일이 같은지 확인하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 15회 작성일 26-09-07 19:35

본문

[이번 수업]
파일의 SHA-256 체크섬을 Python으로 계산해 미리 알고 있는 값과 비교합니다. 체크섬, 비밀번호 해시, 전자서명의 역할도 구분합니다.

[선수지식]
CORE-004의 데이터 표현, PY-006의 파일 처리, EXT-005의 바이트 단위를 알면 좋습니다.

[학습목표]
1. 해시 함수와 체크섬의 역할을 설명합니다.
2. 파일을 작은 조각으로 읽어 SHA-256을 계산합니다.
3. 무결성 확인과 출처 인증의 차이를 구분합니다.

[핵심개념]
해시 함수는 입력 바이트를 고정 길이 요약값으로 바꿉니다. SHA-256 결과는 256비트이며 보통 64자리 16진수입니다. 같은 바이트는 같은 결과를 만들고 한 바이트가 바뀌면 결과도 달라집니다. 파일 비교용 값을 체크섬이라고 부르기도 합니다.

해시는 원본을 되살리는 압축이나 키로 복호화하는 암호화가 아닙니다. 요약값에서 원문을 알아내거나 같은 요약값의 다른 입력을 찾기 어렵게 설계됩니다. SHA-256은 NIST Secure Hash Standard에 정의됩니다.

체크섬 일치는 바이트가 같음을 보여도 출처를 증명하지 않습니다. 파일과 체크섬을 같은 신뢰할 수 없는 곳에서 받으면 둘 다 바뀔 수 있습니다. 기대값은 독립된 신뢰 경로에서 얻으세요. 전자서명은 공개키로 출처와 변경 여부를 검증하는 별도 기술입니다.

비밀번호는 SHA-256 한 번으로 저장하지 않습니다. 고유한 salt와 계산 비용을 조절하는 비밀번호 전용 해시가 필요합니다. 이번 예제는 파일 비교에만 씁니다.

[따라하기]
새 빈 폴더에 checksum_check.py를 만들고 다음 코드를 저장합니다. 실행하면 같은 폴더의 checksum_sample.bin을 고정 내용으로 새로 씁니다.

```python
from hashlib import sha256
from hmac import compare_digest
from pathlib import Path

path = Path("checksum_sample.bin")
path.write_bytes(b"nalcoding checksum\n")
expected = "8eabcffab58a9523937355eda4401a63a7a9d98f83b418514f6c4e31d240e90a"

digest = sha256()
with path.open("rb") as file:
    for chunk in iter(lambda: file.read(8192), b""):
        digest.update(chunk)
actual = digest.hexdigest()

print(f"크기: {path.stat().st_size} B")
print(f"SHA-256: {actual}")
print("결과:", "일치" if compare_digest(actual, expected) else "불일치")
```

macOS와 Linux에서는 `python3 checksum_check.py`, Windows에서는 `py checksum_check.py`로 실행합니다. 예상 결과는 다음과 같습니다.

```text
크기: 19 B
SHA-256: 8eabcffab58a9523937355eda4401a63a7a9d98f83b418514f6c4e31d240e90a
결과: 일치
```

파일을 한꺼번에 메모리에 올리지 않고 8,192바이트씩 읽으므로 큰 파일에도 같은 구조를 적용할 수 있습니다. 이진 모드 `rb`를 써서 운영체제의 텍스트 줄바꿈 변환 영향을 피합니다. 코드는 Windows, macOS, Linux에서 같습니다.

[흔한 실수]
파일 이름이나 크기만 같다고 내용도 같다고 가정하지 마세요. 체크섬 문자열의 대소문자와 앞뒤 공백을 정리한 뒤 알고리즘 이름까지 함께 기록합니다. MD5나 SHA-1처럼 충돌 저항성이 필요한 새 보안 용도에 권장되지 않는 알고리즘을 관성적으로 선택하지 마세요. 체크섬 일치는 파일 출처의 신뢰나 악성 여부를 뜻하지 않습니다.

[보안 주의]
기대 체크섬은 파일과 다른 신뢰 경로에서 확인하고 알고리즘을 SHA-256처럼 명시합니다. 출처를 증명해야 하면 게시자의 전자서명과 인증서 체인도 검증하세요. 확인 전에는 알 수 없는 실행 파일을 열거나 실행하지 않습니다. 경로를 외부 입력으로 받을 때는 허용된 폴더 안인지 확인하고 심볼릭 링크와 파일 크기 제한을 고려합니다. 실습은 본인 소유의 빈 로컬 폴더에서만 진행합니다.

[직접 해볼 과제]
첫 실행 뒤 코드의 `write_bytes` 줄을 잠시 주석 처리하고 checksum_sample.bin의 마지막 글자 하나를 바꾸세요. 다시 실행해 `불일치`가 나오는지 확인합니다. 그다음 읽는 조각 크기를 16으로 바꿔도 SHA-256 결과가 같은지 테스트하세요.

[확인문제]
1. SHA-256 체크섬이 같다는 것은 무엇을 확인해 주나요?
2. 파일과 기대 체크섬을 같은 신뢰할 수 없는 곳에서 받으면 왜 출처를 증명할 수 없나요?
3. 비밀번호 저장에 SHA-256 한 번만 적용하면 안 되는 이유는 무엇인가요?

[다음 학습]
다음 확장 수업에서는 `1.2.3` 같은 버전 번호를 읽고 의존성 범위를 안전하게 정합니다. 호환성 약속과 잠금 파일의 역할을 함께 살펴봅니다.

[공식 참고 자료]
NIST FIPS 180-4 Secure Hash Standard
https://csrc.nist.gov/pubs/fips/180-4/upd1/final

Python hashlib 공식 문서
https://docs.python.org/3/library/hashlib.html

NIST FIPS 186-5 Digital Signature Standard
https://csrc.nist.gov/pubs/fips/186-5/final

NIST SP 800-63B 비밀번호 검증 지침
https://pages.nist.gov/800-63-4/sp800-63b.html

Python hmac.compare_digest 공식 문서
https://docs.python.org/3/library/hmac.html#hmac.compare_digest

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
3,901
어제
6,862
최대
16,772
전체
769,852
Copyright © 소유하신 도메인. All rights reserved.