해시 함수 설명: 파일 무결성을 간단히 확인하는 방법
해시 함수는 전송 후 파일 무결성 확인에 필수적입니다. SHA-256과 MD5가 파일이 변경되지 않았음을 보장하는 방법.
파일을 전송한 뒤 내용이 바뀌었는지 확인하는 가장 확실한 방법은 해시 값을 비교하는 것입니다. SHA-256은 어떤 크기의 입력이든 항상 256비트(32바이트)의 고정된 출력을 생성합니다. 트윗 한 줄이든 10GB 동영상이든 결과 길이는 동일합니다. 입력 비트 하나만 달라져도 출력 비트의 약 절반이 바뀝니다. 전송 전에 SHA-256(파일)을 계산하고, 수신 측에서 다시 계산한 값이 일치하면 파일이 손상 없이 도착했다는 것이 증명됩니다. Linux 배포판이 ISO 다운로드를 검증하고, Git이 커밋을 식별하며, HexaTransfer가 멀티기가바이트 업로드의 완전성을 확인하는 방식이 바로 이것입니다.
해시 함수가 보장하는 세 가지 속성
암호학적 해시 함수는 세 가지 핵심 속성을 갖습니다.
- 결정론성. 같은 입력은 항상 같은 출력을 만듭니다.
SHA-256("hello")는 언제나2cf24dba5fb0a30e...입니다. - 역상 저항성. 해시 값을 알아도 원래 입력을 효율적으로 찾을 수 없습니다.
- 충돌 저항성. 같은 해시 값을 만드는 서로 다른 두 입력을 효율적으로 찾을 수 없습니다.
그 외에도 두 가지 유용한 특성이 있습니다.
- 눈사태 효과. 입력 비트 하나가 바뀌면 출력 비트의 약 50%가 달라집니다. 검색에는 쓸모없지만 지문 채취에는 탁월합니다.
- 고정 출력 크기. SHA-256은 32바이트, SHA-512는 64바이트, BLAKE2b는 64바이트로 입력 크기와 무관합니다.
해시는 암호화가 아닙니다. 단방향이기 때문에 출력에서 입력을 복원할 수 없습니다. 그것이 핵심입니다.
SHA 계열 알고리즘 비교
NIST가 FIPS 180-4와 FIPS 202로 표준화한 Secure Hash Algorithm 계열입니다.
- SHA-1 — 160비트. 2017년 Google의 SHAttered 공격으로 붕괴. 보안 용도에는 사용하면 안 됩니다.
- SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512). 현대 시스템의 주력. SHA-256이 가장 널리 쓰입니다.
- SHA-3 (Keccak). 스펀지 구조(Merkle-Damgård가 아닌)를 채택해 2015년 표준화. SHA-2 취약점에 대비한 대안입니다.
SHA-256은 TLS 인증서 서명, Bitcoin 채굴, Git 커밋 식별, 파일 전송 서비스의 무결성 검사에 사용됩니다. SHA 확장을 지원하는 현대 CPU에서 코어당 처리량은 2~4 GB/s입니다.
MD5와 SHA-1이 보안에서 퇴출된 이유
MD5(1991년)는 128비트 해시를 생성하며 2004년 충돌이 증명될 때까지 표준이었습니다. 2012년에는 Flame 악성코드가 MD5 충돌 공격을 통해 Microsoft 코드 서명 인증서를 위조했습니다. 현재는 노트북에서 초 단위로 MD5 충돌을 만들 수 있습니다.
SHA-1은 더 오래 버텼지만 2017년 Google의 SHAttered 공격에 무너졌습니다. GPU 110년 분량의 연산으로 동일한 SHA-1 해시를 가진 두 PDF를 만들어냈고, 지금은 클라우드 GPU로 10만 달러 미만에 재현 가능합니다.
두 알고리즘 모두 우연한 손상 감지, 스토리지 중복 제거, 캐시 키 지문 등 비보안 용도에는 여전히 적합합니다. 그러나 디지털 서명, 비밀번호 검증, 공격자가 위조로 이득을 얻을 수 있는 모든 상황에서는 사용해선 안 됩니다.
BLAKE2와 BLAKE3: 속도와 보안의 결합
BLAKE2(2012년)와 BLAKE3(2020년)는 SHA-3 수준의 보안을 SHA-256보다 2~10배 빠른 속도로 제공합니다. BLAKE3는 단일 스레드에서 약 6 GB/s를 달성하며 코어 수에 비례해 병렬화됩니다. 16코어 머신에서 100+ GB/s가 가능합니다.
WireGuard는 인증에 BLAKE2s를, Zcash는 BLAKE2b를 사용합니다. b3sum은 개발자 도구에서 sha256sum의 대체제로 자리잡고 있습니다. 멀티기가바이트 업로드를 처리하는 파일 전송 서비스들은 해시 계산이 병목이 되지 않도록 점점 BLAKE3를 채택하고 있습니다.
브라우저는 아직 Web Crypto API를 통해 BLAKE3를 노출하지 않으므로 JavaScript 구현은 WASM 컴파일 참조 코드에 의존하며, 브라우저에서 약 500 MB/s를 처리합니다.
파일 전송 워크플로에서 해시의 역할
해시가 실질적으로 활용되는 여러 상황이 있습니다.
- 업로드 후 무결성 검사. 클라이언트가 업로드 중 SHA-256을 계산하고, 서버도 수신 시 계산해 불일치가 발생하면 재업로드를 트리거합니다. S3는 속도가 우선이므로 수동적 손상 방지에 MD5를 사용합니다.
- 청크 업로드 검증. 대용량 파일을 4MB 또는 5MB 청크로 분할하고 각 청크에 해시를 부여합니다. 해시의 트리(Merkle 트리)로 전체 파일의 단일 루트 해시를 생성합니다.
- 중복 제거. 두 사용자가 같은 파일을 업로드하면 해시가 일치해 스토리지에 한 번만 저장됩니다. Dropbox의 블록 수준 중복 제거와 CDN 캐싱에 활용됩니다.
- 다운로드 검증. 일부 서비스는 다운로드 페이지에 SHA-256을 표시해 수신자가 검증할 수 있게 합니다.
- 버전 식별. Git은 커밋 ID에 SHA-1을 사용합니다(SHA-256으로 전환 진행 중).
HMAC: 무결성에 인증 추가하기
일반 해시는 무결성을 검증하지만 인증은 할 수 없습니다. 누구나 SHA-256(파일)을 계산할 수 있기 때문입니다. 비밀 키를 추가하면 해시가 메시지 인증 코드(MAC)로 변환되어, 키를 가진 사람만 MAC을 생성하거나 검증할 수 있습니다.
HMAC(RFC 2104)은 표준 구조입니다: HMAC(key, msg) = SHA-256(key' ⊕ opad || SHA-256(key' ⊕ ipad || msg)). TLS 1.2, HS256으로 서명된 JWT, AWS 요청 서명, 세션 쿠키 체계에 사용됩니다.
파일 전송에서 HMAC은 AES-GCM의 인증 태그(GHASH를 사용하지만 동일한 역할 수행)와 일부 서비스의 API 요청 서명에 등장합니다.
Merkle 트리: 대규모 해시 처리
매우 큰 파일이나 파일 집합의 경우 매번 전체를 해시하는 것은 비효율적입니다. Merkle 트리는 해시를 이진 트리로 구성합니다. 리프 노드는 청크 해시이고, 내부 노드는 자식들의 해시이며, 루트 해시가 전체 데이터셋을 나타냅니다.
장점은 다음과 같습니다.
- 효율적인 업데이트. 한 청크가 변경되면 log(n)개 노드만 재해시합니다.
- 포함 증명. 특정 청크가 루트에 속한다는 것을 log(n)개 형제 해시만으로 증명할 수 있습니다.
- 병렬 계산. 각 브랜치가 독립적으로 해시됩니다.
BitTorrent(v2 이후), IPFS 콘텐츠 주소 지정, Git의 트리 객체, 인증서 투명성 로그, 블록체인 트랜잭션 루트에 사용됩니다. 파일 전송 서비스는 부분 업로드를 원본과 대조 검증하는 재개 가능한 업로드에 Merkle 트리를 활용합니다.
다운로드를 직접 검증하는 방법
macOS나 Linux에서:
shasum -a 256 ubuntu-24.04.iso
Windows PowerShell에서:
Get-FileHash ubuntu-24.04.iso -Algorithm SHA256
출력을 ubuntu.com에 게시된 해시와 비교합니다. 일치하면 파일이 손상 없이 다운로드됐고 Canonical이 서명한 내용과 일치합니다. 다르다면 다운로드가 손상됐거나 누군가가 파일을 교체한 것입니다.
최대 신뢰를 위해서는 GPG와 Canonical 서명 키로 해시 파일 자체의 서명도 검증하세요. 서명된 해시 파일 → 파일 해시 → 파일로 이어지는 다단계 체인이 Linux 배포판이 수십 년간 신뢰를 유지해온 방식입니다.
파일 전송 서비스의 무결성 처리 확인
모든 파일 전송 공급자에게 물어볼 가치 있는 네 가지 질문입니다.
- 업로드 검증에 어떤 해시 알고리즘을 사용하나요? (SHA-256이나 BLAKE3는 좋음. MD5는 손상 검사용으로만 허용. 답이 없으면 주의)
- 수신자에게 해시 값을 보여주나요?
- 청크 업로드 시 Merkle 트리 검증을 하나요?
- 엔드포인트 간 해시를 비교하는 방법이 있나요?
SwissTransfer, Tresorit, Proton Drive, HexaTransfer는 모두 전송 중 SHA-256을 계산하고 수신 시 검증합니다. 무결성 실패 시 전체 전송이 실패하는 대신 영향을 받은 청크만 자동으로 재업로드됩니다.
hexatransfer.com에서 사용해 보세요 — 무료, 계정 불필요, 최대 10GB.
엔드투엔드 암호화로 대용량 파일을 안전하게 전송
엔드투엔드 암호화로 최대 10GB의 파일을 무료로 전송하세요. 계정이 필요하지 않습니다. 업로드 전에 브라우저에서 파일이 암호화되어 다른 사람은 읽을 수 없습니다.
파일 보내기