파일 해시 검증 도구
파일의 MD5, SHA-1, SHA-256, SHA-384, SHA-512 해시 값 계산
파일을 여기로 드래그하세요
모든 파일 유형과 크기 지원
파일 해시란?
파일 해시는 파일 내용을 특정 알고리즘을 통해 고정 길이의 다이제스트로 매핑하는 과정입니다. 동일한 파일은 항상 동일한 해시 값을 생성하며, 파일 내용의 미세한 변화라도 완전히 다른 결과를 초래하고, 해시 값에서 파일 내용을 역추적할 수 없습니다. 이 도구는 MD5, SHA-1, SHA-256, SHA-384, SHA-512 등 다양한 알고리즘을 지원하여 다양한 시나리오의 검증 요구를 충족합니다.
사용 방법
사용 방법
- 파일을 업로드 영역으로 끌어다 놓거나 '파일 선택' 버튼을 클릭하세요
- 계산할 해시 알고리즘을 선택하세요(복수 선택 가능)
- '해시 계산' 버튼을 클릭하면 계산이 시작됩니다
- 계산이 끝나면 개별 해시 값을 복사하거나 한꺼번에 복사할 수 있습니다
- 검증을 위해 비교 입력란에 알려진 해시 값을 입력하세요
검증 워크플로우
- 파일 다운로드나 복사가 완전히 끝난 후 해시를 계산하세요. 불완전한 파일이나 전송이 중단된 상태에서는 다른 값이 나옵니다.
- 공개된 체크섬과 비교할 때는 공식 출처에서 값을 복사하고 알고리즘을 정확히 맞추세요.
활용 사례
기술 원리
이 페이지의 모든 SHA 다이제스트는 W3C Web Cryptography API(브라우저에서 crypto.subtle로 노출됨)를 통해 계산됩니다. 호출 형태는 await crypto.subtle.digest(algorithm, buffer)이며, algorithm은 'SHA-1', 'SHA-256', 'SHA-384', 'SHA-512' 중 하나(대소문자 구분)이고, buffer는 ArrayBuffer 또는 임의의 TypedArray입니다. 이 함수는 Promise를 반환하며, 해결되면 다이제스트 바이트의 ArrayBuffer가 됩니다. 페이지는 이를 new Uint8Array로 순회하면서 각 바이트를 byte.toString(16).padStart(2, '0')으로 매핑해 소문자 16진수로 변환합니다. SubtleCrypto는 안전한 컨텍스트(HTTPS 또는 localhost)에서만 사용할 수 있고, SHA-1은 레거시 검증을 위해 남겨두지만 사양에서는 이미 충돌 저항성이 깨진 것으로 명시되어 있습니다. MD5는 Web Crypto 사양에 포함되지 않고(W3C가 충돌 공격 때문에 의도적으로 제외함), 이 페이지의 MD5는 브라우저 내에서 전적으로 실행되는 순수 JavaScript 구현으로 계산됩니다. MD5와 SHA 계열 모두에서 본 도구는 FileReader.readAsArrayBuffer로 파일을 한 번에 ArrayBuffer로 읽어 들인 뒤, JavaScript MD5 루틴 또는 crypto.subtle.digest에 전달합니다. 본 도구에는 .append 증분 API도, Web Worker 폴백도 없으므로 메모리는 파일 전체를 한 번에 담을 수 있어야 합니다. 일반적인 다운로드는 문제없지만, 수 GB 페이로드의 경우 디스크에서 스트리밍하는 데스크톱 도구(sha256sum, certutil -hashfile, Get-FileHash)가 더 적합합니다. 다이제스트 길이와 보안 상태: MD5 = 128비트 / 32자리 16진수(RFC 1321, 왕샤오윈 2004년부터 충돌 저항성이 깨짐, 2012년 Flame 악성코드가 실전 활용); SHA-1 = 160비트 / 40자리 16진수(FIPS 180-4, Google SHAttered가 2017년 약 9.2 × 10^18 회 SHA-1 연산으로 충돌을 시연, NIST는 2030년 이후 공식 폐기 계획); SHA-256 = 256비트 / 64자리 16진수(FIPS 180-4, 알려진 충돌 없음, 권장 기준); SHA-384와 SHA-512 = 384 / 512비트로 SHA-512 계열의 절단 및 완전 출력(FIPS 180-4). 암호학 해시의 눈사태 효과 때문에 입력에서 한 비트만 뒤집어도 출력 비트의 약 절반이 평균적으로 바뀌고, 그래서 한 바이트만 수정해도 완전히 다른 다이제스트가 나옵니다.
- crypto.subtle.digest(algorithm, buffer)는 'SHA-1', 'SHA-256', 'SHA-384', 'SHA-512'(대소문자 구분)를 허용하고 'MD5'는 거부; 보안 컨텍스트(HTTPS 또는 localhost)가 필요하며 Promise<ArrayBuffer>를 반환.
- hex 인코딩: 결과를 new Uint8Array(digestBuffer)로 순회하며 각 바이트를 byte.toString(16).padStart(2, '0')로 매핑; 다이제스트 비교는 대소문자 무시(.toLowerCase()로 정규화).
- MD5는 의도적으로 Web Crypto에서 제외되어 있습니다. 본 도구는 순수 JavaScript로 MD5를 계산하며, FileReader.readAsArrayBuffer로 파일을 단일 ArrayBuffer로 한 번에 읽어 32자리 소문자 16진수 다이제스트를 한 번에 생성합니다.
- 메모리 프로파일: 페이지는 .append 증분 API도, Web Worker 오프로드도 사용하지 않고 파일 전체를 단일 ArrayBuffer로 읽은 뒤 한 번의 호출로 JavaScript MD5나 crypto.subtle.digest에 전달합니다. 탭의 가용 힙을 초과하는 파일은 디스크에서 스트리밍하는 데스크톱 도구(sha256sum, certutil -hashfile, Get-FileHash)를 사용하세요.
- 다이제스트 크기(FIPS 180-4): MD5 128비트, SHA-1 160비트, SHA-256 256비트, SHA-384 384비트, SHA-512 512비트; hex 문자 수는 바이트 수의 2배.
- 알려진 충돌 공격: MD5는 Wang 2004년에 깨짐, Flame 2012년에 악용; SHA-1은 Google SHAttered 2017년에 깨짐(약 9.2 x 10^18회 연산, 약 110 GPU-년); SHA-256 이상은 알려진 실용적 충돌 없음.
- 눈사태 효과: 단일 비트 입력 변경 시 평균 약 50%의 출력 비트가 뒤집힘; 이것이 1바이트 편집만으로 완전히 다른 hex 다이제스트가 생성되고 부분 파일 일치가 존재하지 않는 이유.
예시
다운로드한 파일을 게시된 체크섬과 대조 검증
파일: sample.bin (3바이트, 내용: abc)
SHA-256 (계산 결과):
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
게시자의 SHA256SUMS 라인:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad sample.bin
일치 -> 다운로드가 손상되지 않고 변조되지 않음
(두 값 모두 3바이트 입력 'abc'에 대한 FIPS 180-2 SHA-256 참조 벡터입니다.
실제로는 입력을 실제 파일로 교체하세요. 알고리즘 출력은 결정적입니다.)동일 입력에 대한 다중 알고리즘 비교
파일: sample.txt (3바이트, 내용: abc)
MD5: 900150983cd24fb0d6963f7d28e17f72
SHA-1: a9993e364706816aba3e25717850c26c9cd0d89d
SHA-256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA-512: ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
알고리즘은 다르지만 입력은 동일 -> 보안 검증에는 SHA-256 이상 사용
(MD5는 RFC 1321 참조 벡터이며, 나머지는 모두 3바이트 입력 'abc'에 대한
FIPS 180-2 참조 벡터입니다.)1바이트 변경 감지 (눈사태 효과)
입력 A: abc (3바이트)
입력 B: abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq (56바이트)
A의 SHA-256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
B의 SHA-256: 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
입력의 작은 변경이 완전히 다른 다이제스트를 만들어냅니다 ->
이것이 바로 눈사태 효과입니다.
(두 값 모두 FIPS 180-2 SHA-256 참조 벡터입니다.)검증을 위한 브라우저 콘솔 참고
// 비교를 위해 Node.js에서 재현
$ printf 'abc' | shasum -a 256
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
// Windows의 PowerShell
PS> 'abc' | Get-FileHash -Algorithm SHA256 | Select-Object -ExpandProperty Hash
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
// 브라우저 콘솔에서 Web Crypto API 사용:
// const buf = new TextEncoder().encode('abc');
// const hash = await crypto.subtle.digest('SHA-256', buf);
// -> 'abc'의 SHA-256 ArrayBuffer (FIPS 180-2 참조 벡터)
파일은 브라우저에 머물며 어떤 것도 업로드되지 않습니다.자주 묻는 질문
어떤 해시 알고리즘을 사용할 수 있나요?
MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512가 일반적인 옵션입니다. 본 페이지는 브라우저의 Web Crypto API(SHA 계열)와 내장 JS 구현(MD5)을 사용해 계산합니다. 오늘날 범용으로는 SHA-256이 권장됩니다.
파일이 어디론가 업로드되나요?
아니요. 해싱은 File API와 Web Crypto를 사용해 전적으로 브라우저에서 이루어집니다. 파일 바이트는 청크 단위로 메모리에 읽혀 로컬에서 해시되며 네트워크를 거치지 않습니다. 해시 중에 네트워크 탭을 확인하면 직접 검증할 수 있습니다.
MD5가 취약하다고 하는데 왜 아직 제공하나요?
MD5는 보안 용도로는 취약하지만(충돌을 쉽게 만들 수 있음), 다운로드한 파일이 원본과 비트 단위로 동일한지 확인하는 사실상의 체크섬 표준으로 여전히 쓰입니다. 많은 벤더가 SHA-256과 함께 MD5도 제공합니다. 다만 비밀번호 해싱이나 서명 용도로는 절대 사용하지 마세요.
같은 파일처럼 보이는데 SHA-256 해시가 왜 다르게 나오나요?
해시 입력에는 모든 바이트가 포함되므로, 끝의 줄바꿈 하나, BOM, 줄바꿈 차이(CRLF vs LF) 같은 사소한 변화에도 해시가 완전히 달라집니다. 복사해 붙이지 말고 원본을 다시 다운로드하거나, 바이너리 뷰어로 두 파일의 바이트가 동일한지 확인하세요.
파일 크기 제한이 있나요?
브라우저가 파일을 처리할 만큼의 메모리를 확보해야 합니다. 최신 데스크톱은 수 GB 파일도 처리할 수 있지만, 모바일 브라우저는 수백 MB 정도에서 메모리가 부족해질 수 있습니다. 매우 큰 파일은 디스크에서 스트리밍하는 데스크톱 도구(sha256sum, certutil, Get-FileHash)를 사용하는 편이 빠르고 안전합니다.
서로 다른 두 파일이 같은 해시를 가질 수 있나요?
이론적으로는 가능하지만(비둘기집 원리), SHA-256에서는 그 확률이 천문학적으로 낮습니다. MD5와 SHA-1은 알려진 충돌 공격이 있으므로 두 파일의 MD5나 SHA-1이 같다고 해서 동일한 파일임을 보장할 수 없습니다. SHA-256은 알려진 공격으로는 충돌을 만들 수 없습니다.
공식 사이트에서 게시한 해시와 결과가 다릅니다. 왜 그런가요?
보통 다음과 같은 원인입니다. 지역화/서명/재패키징된 버전을 받았거나, 사이트가 다른 버전의 해시를 게시했거나, 다운로드 도중 잘렸을 수 있습니다. 다른 도구로 다시 다운로드한 뒤 해시를 다시 계산해 보세요. 그래도 일치하지 않는다면 그 파일을 신뢰하지 마세요.