파일의 해시값 / MD5, SHA-1, SHA-256
파일의 해시값은 파일 내용을 일정한 길이의 값으로 계산한 결과이며, 다운로드한 파일이 기준 파일과 같은지 확인할 때 사용합니다. 같은 바이트를 같은 알고리즘으로 계산하면 같은 값이 나오지만, 서로 다른 파일의 값이 같아지는 충돌 가능성까지 없어지는 것은 아닙니다. 일반적인 파일 검증에는 SHA-256을 우선 고려하고, 비교할 기준값의 출처도 함께 확인해야 합니다.
파일의 해시값은 무엇을 나타내나요?
해시 함수(hash function)는 입력 데이터를 계산해 요약값인 해시값 또는 다이제스트(digest)를 만드는 함수입니다. MD5, SHA-1, SHA-256은 각각 출력 길이가 정해져 있어 작은 문서와 큰 설치 파일을 계산해도 같은 알고리즘의 결과 길이는 같습니다. 파일 전체를 줄여 보관하는 압축 파일과는 다르며, 해시값만으로 원래 파일을 복원하는 기능은 없습니다. NIST의 해시 함수 설명은 이러한 요약값의 성질과 보안 요구 사항을 정리합니다.
일반적인 파일 해시 도구는 파일명이나 폴더 위치가 아니라 파일 안의 바이트를 읽습니다. 내용을 그대로 둔 채 이름만 바꾸면 값은 같습니다. 반대로 화면에 같은 문장이 보여도 줄바꿈, 문자 인코딩 또는 파일 내부 메타데이터가 바뀌면 바이트가 달라져 다른 값이 나올 수 있습니다.
해시를 파일의 지문에 비유할 수는 있지만 절대적으로 고유한 번호라고 단정해서는 안 됩니다. 서로 다른 입력이 같은 값으로 계산되는 현상을 충돌(collision)이라고 합니다. 안전한 암호학적 해시 함수는 공격자가 그런 입력을 찾아내기 어렵도록 설계되며, MD5와 SHA-1은 이 용도의 보안 요구를 충족하지 못합니다.
MD5, SHA-1, SHA-256의 차이
MD5는 Message-Digest Algorithm 5, SHA는 Secure Hash Algorithm의 약어입니다. SHA-256은 SHA-2 계열에 속하며 256비트의 결과를 만듭니다. 사람이 비교할 때는 이 값을 16진수 문자열로 표시하는 경우가 많습니다. 16진수 한 글자는 4비트를 표현하므로 결과 길이는 다음과 같습니다.
| 알고리즘 | 결과 길이 | 16진수 길이 | 파일 검증에서의 선택 |
|---|---|---|---|
| MD5 | 128비트 · 16바이트 | 32글자 | 과거 체크섬과 비교할 때 사용될 수 있으나, 악의적인 변조 방지의 근거로 삼지 않습니다. |
| SHA-1 | 160비트 · 20바이트 | 40글자 | 기존 자료의 값과 비교할 수 있으나, 새로운 보안 용도의 선택으로 권장하지 않습니다. |
| SHA-256 | 256비트 · 32바이트 | 64글자 | 게시자가 SHA-256 값을 제공한다면 일반적인 다운로드 무결성 확인에 우선 고려합니다. |
MD5의 길이와 충돌 저항성 문제는 RFC 6151의 MD5 보안 설명에, SHA 계열의 규격은 NIST의 Secure Hash Standard에 나와 있습니다. MD5와 SHA-1을 단순 전송 오류 확인에 사용하는 상황과 공격자가 파일을 바꿀 수 있는 상황은 구분해야 합니다.
비교할 때는 같은 알고리즘의 값을 사용해야 합니다. 공식 페이지에 MD5만 적혀 있는데 내 파일의 SHA-256 값과 비교하면 의미가 없습니다. 또한 256비트 출력이라는 설명이 모든 공격에 256비트의 보안 강도를 제공한다는 뜻은 아닙니다. 새 보안 용도로 SHA-1을 피해야 하는 이유와 공격 유형별 강도는 NIST의 알고리즘·보안 강도 안내를 참고하세요.
내용 한 글자가 바뀌면 어떻게 되나요?
다음 Python 코드는 ASCII 바이트 abc와 abC의 SHA-256을 계산합니다. 마지막 글자만 바꾸었고 끝에 줄바꿈을 넣지 않았습니다. Python 3.12에서 직접 실행한 결과이며, 아래 두 값은 모두 64글자입니다.
import hashlib
for data in (b"abc", b"abC"):
print(data.decode("ascii") + ": " + hashlib.sha256(data).hexdigest())
실행 결과:
abc: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
abC: 0a2432a1e349d8fdb9bfca91bba9e9f2836990fe937193d84deef26c6f3b8f76
두 입력은 비슷해 보이지만 결과는 크게 달라집니다. 이 예제가 모든 서로 다른 입력에 대해 서로 다른 결과를 보장하는 것은 아닙니다. 같은 입력과 알고리즘에는 같은 결과가 나오며, 충돌 가능성과 알고리즘의 공격 저항성은 별도로 판단해야 합니다.
다운로드한 파일의 해시값으로 검증하기
무결성(integrity) 검증은 파일이 기준 데이터와 달라졌는지 확인하는 작업입니다. 해시를 새로 계산하는 것만으로 검증이 끝나지 않으며, 신뢰할 수 있는 기준 해시값이 있어야 비교할 수 있습니다.
- 제작자의 공식 다운로드 페이지나 신뢰할 수 있는 배포 경로에서 해당 파일의 기준 해시값을 확인합니다.
- 운영체제, CPU 종류, 버전과 파일명이 다운로드한 항목과 같은지 확인하고, 기준값의 알고리즘을 확인합니다.
- 파일 다운로드를 완료한 뒤 아래 도구로 같은 알고리즘의 해시값을 계산합니다. 계산 중 파일을 수정하거나 덮어쓰지 않습니다.
- SHA-256이라면 앞부분만 보지 말고 64글자 전체를 비교합니다. 16진수 영문자의 대소문자는 같은 숫자를 표현합니다.
- 값이 다르면 파일을 실행하거나 설치하지 말고 비교 대상을 다시 확인합니다. 올바른 대상인데도 다르면 공식 경로에서 새로 내려받아 다시 검증합니다.
공격자가 파일과 기준 해시값을 둘 다 바꿀 수 있다면 값이 일치해도 출처를 확인할 수 없습니다. 해시값의 일치는 기준 데이터와의 비교 결과이지 파일이 악성 코드 없이 안전하다는 보증이 아닙니다. 배포자가 서명된 체크섬이나 디지털 서명을 제공하면 신뢰할 수 있는 공개키와 배포 안내에 따라 서명도 확인하는 편이 좋습니다.
운영체제별 SHA-256 확인 명령
아래의 example.iso는 설명용 파일명입니다. 실제 다운로드한 파일명과 경로로 바꾸고, 경로에 공백이 있으면 따옴표로 감싸세요. 명령은 파일을 읽어 값을 계산하며 원본 내용을 바꾸지 않습니다.
Windows: PowerShell의 Get-FileHash
시작 메뉴에서 PowerShell을 열고 다음 명령을 실행합니다. -LiteralPath는 경로를 와일드카드로 해석하지 않고 그대로 사용하며, -Algorithm SHA256으로 비교할 알고리즘을 명시합니다.
Get-FileHash -LiteralPath 'C:\Downloads\example.iso' -Algorithm SHA256 | Format-List
결과의 Algorithm, Hash, Path를 확인하세요. SHA-256이 기본값이지만 명시하면 기존 자료의 다른 알고리즘과 혼동하기 쉽지 않습니다. Microsoft의 Get-FileHash 문서는 지원 알고리즘과 출력 항목을 설명합니다. 파일을 찾을 수 없다는 오류가 나면 탐색기에서 실제 경로와 확장자를 확인합니다.
Linux: sha256sum
GNU Coreutils의 sha256sum이 설치된 환경에서 터미널을 열고 다음 명령을 실행합니다. 일반적인 출력은 해시값과 파일명을 함께 표시합니다.
sha256sum "/home/user/Downloads/example.iso"
배포자가 GNU 형식의 SHA256SUMS 파일을 제공한다면, 그 파일과 검증할 파일을 같은 폴더에 둔 뒤 다음 명령으로 목록을 검사할 수 있습니다. 목록에 적힌 경로와 파일이 있어야 하며, 전체 목록의 다른 파일을 내려받지 않았다면 해당 항목의 누락도 표시될 수 있습니다.
sha256sum --check SHA256SUMS
일치하는 항목은 OK, 불일치는 실패로 표시됩니다. 체크섬 목록 자체의 출처도 확인해야 합니다. 명령과 검사 옵션은 GNU의 SHA-2 유틸리티 안내를 참고하세요. 명령을 찾을 수 없으면 해당 배포판의 Coreutils 설치 여부를 확인합니다.
macOS: shasum
터미널에서 shasum을 사용할 수 있는 환경이라면 -a 256으로 SHA-256을 명시합니다. 옵션 없이 실행한 shasum의 기본 알고리즘은 SHA-1이므로 비교 대상과 혼동하지 않도록 합니다.
shasum -a 256 "/Users/user/Downloads/example.iso"
같은 도구의 출력 형식에 맞는 체크섬 목록은 shasum -a 256 -c SHA256SUMS로 검사할 수 있습니다. 알고리즘 선택과 -c 옵션은 shasum 개발자의 사용 안내에서 확인할 수 있습니다. 실제 macOS에서 이 글의 명령을 실행한 결과를 제시하는 것은 아니며, 도구가 없다면 아래 Python 방법을 사용할 수 있습니다.
Python으로 큰 파일의 SHA-256 계산하기
Python 3가 설치되어 있다면 표준 라이브러리 hashlib로도 계산할 수 있습니다. 아래 코드를 hash-file.py로 저장하세요. 파일을 바이너리 모드인 rb로 열고 1 MiB씩 읽으므로 전체 파일을 한꺼번에 메모리에 올리지 않습니다. 이 코드의 대입 표현식 문법은 Python 3.8 이상에서 사용할 수 있습니다.
import hashlib
import sys
if len(sys.argv) != 2:
raise SystemExit("Usage: python hash-file.py FILE")
digest = hashlib.sha256()
with open(sys.argv[1], "rb") as file:
while chunk := file.read(1024 * 1024):
digest.update(chunk)
print(digest.hexdigest())
스크립트가 있는 폴더에서 다음처럼 실제 파일 경로를 전달합니다. 환경에 따라 Python 3 실행 명령이 python3 또는 py라면 python 대신 해당 명령을 사용하세요.
python hash-file.py "example.iso"
출력은 SHA-256의 64글자 16진수 값입니다. 같은 바이트라면 PowerShell 등의 계산 결과와 같으며, 영문자 대소문자 표시만 다를 수 있습니다. update()와 hexdigest()의 동작은 Python hashlib 공식 문서에 설명되어 있습니다. Windows에서 Python 3.12.14와 PowerShell 7.6.5로 작은 파일·빈 파일·여러 청크의 파일을 계산해 일치 여부를 확인했습니다.
해시값이 다를 때 확인할 사항
- 다른 배포 파일: x64와 ARM64, 설치 파일과 압축 파일, 다른 버전을 비교하지 않았는지 확인합니다.
- 알고리즘 불일치: MD5·SHA-1·SHA-256은 서로 다른 값이므로 알고리즘 이름을 다시 확인합니다.
- 다운로드 중단: 내려받기가 끝났는지, 다운로드 도구가 오류를 표시했는지 확인합니다.
- 압축 해제·변환: 압축 파일의 기준값은 그 안에서 꺼낸 파일의 기준값이 아닙니다. 편집기 저장, 줄바꿈 변환, 이미지 재압축도 바이트를 바꿀 수 있습니다.
- 경로·복사 오류: 명령이 실제로 읽은 파일과 기준값 전체를 확인합니다. 다른 파일의 값이나 잘린 문자열을 복사하지 않았는지 살펴봅니다.
원인을 모르는 상태에서 기준값을 내가 계산한 값으로 바꾸어 맞추지 마세요. 안전한 배포 경로와 비교 대상을 먼저 확인하고, 다시 다운로드해도 일치하지 않으면 배포자의 안내나 수정 여부를 확인해야 합니다.
해시가 할 수 있는 일과 할 수 없는 일
| 용도 | 해시의 역할 | 추가로 필요한 판단 |
|---|---|---|
| 파일 무결성 확인 | 기준값과 현재 파일의 내용을 비교합니다. | 기준값의 출처와 알고리즘이 신뢰할 수 있어야 합니다. |
| 중복 파일 찾기 | 같은 해시의 파일을 중복 후보로 묶을 수 있습니다. | 충돌 가능성을 고려하며, 정확성이 중요하면 바이트 단위로도 비교합니다. |
| 디지털 서명 | 서명 방식의 일부로 데이터 요약값을 사용할 수 있습니다. | 해시를 계산하는 것만으로 서명이나 작성자 인증이 생기지 않습니다. |
| 비밀번호 저장 | 비밀번호 검증에도 해시 기반 방식이 사용됩니다. | 파일용 SHA-256을 그대로 쓰지 말고 비밀번호 전용 방식을 사용해야 합니다. |
해싱은 암호화가 아닙니다. 암호화는 적절한 키로 원문을 복호화하는 용도지만 해시는 원문을 복원하기 위한 형식이 아닙니다. 다만 짧거나 쉽게 추측되는 입력은 후보를 계산해 값을 대조할 수 있으므로, 해시만 만들었다고 비밀이 보호되는 것도 아닙니다.
비밀번호에는 단순 MD5·SHA-1·SHA-256 대신 Argon2id 같은 비밀번호 전용 해시와 적절한 비용 설정·고유한 솔트(salt)를 사용하는 검증된 라이브러리를 선택하세요. 솔트는 비밀번호마다 다른 값을 더해 사전 계산 공격을 어렵게 만드는 데이터입니다. OWASP의 비밀번호 저장 지침은 파일 해시와 비밀번호 저장을 구분해야 하는 이유를 설명합니다. 다운로드 파일을 확인할 때는 SHA-256 계산, 신뢰할 수 있는 기준값 확보, 전체 값 비교가 핵심입니다.




