CRC32와 SHA-256을 같은 자리에 쓰지 않는 이유
체크섬은 오류를 찾고 해시는 변조를 막습니다. CRC32, MD5, SHA-256의 용도 구분과 해시를 확인해도 소용없는 경우를 정리했습니다.
파일을 내려받으면 옆에 값이 하나 붙어 있습니다. 어떤 곳은 CRC32, 어떤 곳은 MD5, 어떤 곳은 SHA-256을 적어 둡니다. 셋 다 "값이 맞는지 확인하는 용도"로 보이지만 막는 대상이 다릅니다.
CRC32는 해시가 아니다
CRC는 순환 중복 검사(Cyclic Redundancy Check)의 약자로, 전송이나 저장 중에 비트가 뒤집혔는지 찾기 위한 오류 검출 코드입니다. 32비트라 값의 종류가 약 43억 개입니다.
숫자가 커 보이지만 충돌은 쉽게 일어납니다. 생일 문제로 계산하면 약 7만 7천 개만 모여도 같은 값을 가진 쌍이 나올 확률이 절반입니다. 실제로 다섯 글자 문자열에서도 금방 찾을 수 있습니다.
CRC32("l98cu") = 0x5304d385
CRC32("pvdba") = 0x5304d385
더 중요한 성질은 CRC가 선형이라는 점입니다. 원하는 CRC 값이 나오도록 입력을 계산해서 만들 수 있습니다. 내용을 바꾸고 남는 자리에 몇 바이트를 채워 넣으면 원래 값과 같은 CRC를 맞출 수 있습니다. 그래서 CRC는 실수로 생긴 오류는 잘 잡지만, 의도적인 변조는 전혀 막지 못합니다.
zip 파일과 gzip 파일 안에 CRC32가 들어 있는 것도 같은 이유입니다. 압축 해제가 제대로 됐는지 확인하는 용도이지, 파일이 정상인지 보증하는 값이 아닙니다.
MD5와 SHA-1은 충돌이 만들어진다
MD5는 2004년에 충돌을 만드는 방법이 공개됐습니다. 지금은 일반 노트북에서 몇 초 만에 같은 MD5를 갖는 서로 다른 두 파일을 만들 수 있습니다.
SHA-1은 2017년에 실제 충돌 사례가 나왔습니다. 내용이 다른데 SHA-1이 같은 PDF 두 개가 공개됐습니다. 이후 인증서와 서명에서 SHA-1은 퇴출됐습니다.
여기서 말하는 충돌은 공격자가 두 입력을 모두 고를 수 있을 때의 이야기입니다. 주어진 해시값에 맞는 입력을 찾는 것(역상 공격)은 MD5에서도 여전히 어렵습니다. 그래서 다음처럼 나뉩니다.
- 공격자가 없는 환경의 중복 탐지, 캐시 키 — MD5도 문제없습니다. 빠르기까지 합니다
- 배포물 검증, 서명, 인증서 — MD5와 SHA-1은 쓰면 안 됩니다
무엇을 언제 쓰나
| 목적 | 쓸 것 | 이유 |
|---|---|---|
| 전송·저장 중 비트 오류 검출 | CRC32 | 빠르고, 애초에 그 목적으로 설계됨 |
| 내부 중복 파일 탐지, 캐시 키 | MD5, BLAKE3 | 속도. 공격자를 가정하지 않는 자리 |
| 배포 파일 무결성 | SHA-256 + 서명 | 의도적 변조를 막아야 함 |
| 메시지 인증 | HMAC | 비밀키를 아는 쪽만 값을 만들 수 있음 |
| 비밀번호 저장 | bcrypt, Argon2 | 일반 해시는 너무 빠름 |
BLAKE3는 SHA-256보다 빠르면서 암호학적 강도를 유지합니다. 큰 파일을 자주 해싱해야 하는데 속도가 걸린다면 후보가 됩니다.
해시를 확인해도 소용없는 경우
배포 페이지에 파일과 SHA-256 값이 나란히 있는 경우가 많습니다. 그런데 그 서버가 침해되면 공격자는 파일과 해시를 둘 다 바꿉니다. 옆에 적힌 값과 비교하는 것만으로는 아무것도 확인되지 않습니다.
해시가 의미를 가지려면 값이 다른 경로로 와야 합니다.
- 배포자의 개인키로 서명된 서명 파일(
.asc,.sig)을 검증합니다 - 패키지 매니저가 잠금 파일에 기록해 둔 해시와 비교합니다. 처음 받은 시점의 값이 기준이 됩니다
- 해시가 다른 도메인이나 저장소에 게시돼 있다면 그쪽과 대조합니다
같은 곳에서 온 파일과 해시를 비교하는 것은 전송 오류만 확인해 줍니다. 중간에 누가 바꿨는지는 알 수 없습니다.
확인 순서
- 이 값으로 막으려는 것이 오류인지 변조인지 정합니다
- 오류만 잡으면 되는 자리라면 CRC32로 충분합니다
- 변조를 막아야 한다면 SHA-256 이상을 쓰고, 값을 파일과 다른 경로로 받습니다
- 같은 해시를 두 번 계산했는데 다르다면 개행 처리나 인코딩부터 봅니다. 텍스트 파일을 다른 운영체제에서 받으면 줄바꿈이 바뀌어 해시가 달라집니다
tools.onuel.dev에 CRC32, MD5, SHA-256, BLAKE3가 각각 있어 같은 입력을 넣고 값의 길이와 계산 결과를 비교할 수 있습니다. 계산은 브라우저 안에서 이루어집니다.
- #해시
- #체크섬
- #무결성