개발 이야기3분 읽기

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)을 검증합니다
  • 패키지 매니저가 잠금 파일에 기록해 둔 해시와 비교합니다. 처음 받은 시점의 값이 기준이 됩니다
  • 해시가 다른 도메인이나 저장소에 게시돼 있다면 그쪽과 대조합니다

같은 곳에서 온 파일과 해시를 비교하는 것은 전송 오류만 확인해 줍니다. 중간에 누가 바꿨는지는 알 수 없습니다.

확인 순서

  1. 이 값으로 막으려는 것이 오류인지 변조인지 정합니다
  2. 오류만 잡으면 되는 자리라면 CRC32로 충분합니다
  3. 변조를 막아야 한다면 SHA-256 이상을 쓰고, 값을 파일과 다른 경로로 받습니다
  4. 같은 해시를 두 번 계산했는데 다르다면 개행 처리나 인코딩부터 봅니다. 텍스트 파일을 다른 운영체제에서 받으면 줄바꿈이 바뀌어 해시가 달라집니다

tools.onuel.devCRC32, MD5, SHA-256, BLAKE3가 각각 있어 같은 입력을 넣고 값의 길이와 계산 결과를 비교할 수 있습니다. 계산은 브라우저 안에서 이루어집니다.

  • #해시
  • #체크섬
  • #무결성