← 모두의 툴

MD5·SHA-1은 왜 아직 쓰이지만 보안엔 못 쓰나 — 해시 vs HMAC vs CRC32

가이드 · 2026-08-19 최종 확인

"MD5는 깨졌다"는 말을 듣고도 여전히 다운로드 페이지에 MD5 체크섬이 붙어 있는 걸 보면 혼란스러울 수 있습니다. 깨졌다는데 왜 아직 쓰일까요? 정답은 "깨졌다"의 정확한 의미를 알아야 풀립니다 — MD5·SHA-1이 무력화된 건 특정한 종류의 공격 한 가지뿐이고, 그 공격이 문제 되지 않는 용도에서는 지금도 멀쩡히 쓰입니다.

1. "충돌 공격"이 정확히 무엇을 깨뜨리는가

해시 함수의 핵심 안전성 요구사항 중 하나가 충돌 저항성(collision resistance)입니다 — 서로 다른 두 입력이 같은 해시값을 내놓는 쌍을 찾는 게 사실상 불가능해야 한다는 뜻입니다. MD5는 2004~2005년 왕샤오윈(Wang Xiaoyun) 등의 연구로 이 저항성이 실용적 수준에서 무너졌음이 증명됐고, 2008년에는 이를 실전에 적용해 MD5 충돌을 악용한 가짜 인증기관(rogue CA) 인증서를 만들어낸 연구 사례가 공개되며 파장을 일으켰습니다. SHA-1은 더 오래 버텼지만, 2017년 구글과 CWI 암스테르담이 "SHAttered" 공격을 공개하면서 상황이 바뀌었습니다 — 내용이 다른 두 개의 PDF 파일이 동일한 SHA-1 해시값을 갖도록 실제로 만들어낸, 세계 최초의 공개된 실증 SHA-1 충돌이었습니다. 이 발표 이후 주요 브라우저와 인증기관은 SHA-1 기반 인증서 발급을 중단했고, Git처럼 커밋 식별에 여전히 SHA-1을 쓰는 시스템들도 점진적으로 충돌 대응 로직을 넣거나 SHA-256으로 전환하는 흐름을 이어가고 있습니다.

2. 그런데 왜 아직도 쓰이는가: "깨졌다"가 안 통하는 용도

충돌 공격이 위협적인 경우는 공격자가 일부러 같은 해시를 갖는 두 입력을 만들어내려 할 때뿐입니다. 다운로드 파일의 무결성 체크섬, 우발적 손상 감지, 캐시 키 생성, 중복 파일 탐지처럼 "누군가 악의적으로 조작하지 않는 한" 문제없는 용도에서는 MD5·SHA-1이 지금도 실용적으로 충분히 안전합니다. 즉 "깨졌다"는 "모든 용도에서 못 쓴다"가 아니라 "적대적 상황에서 보안 목적으로는 못 쓴다"는 뜻입니다. 반대로 비밀번호 저장, 디지털 서명, TLS 인증서처럼 공격자가 의도적으로 값을 조작할 유인이 있는 곳에서는 반드시 SHA-256 이상을 써야 합니다.

3. 해시와 HMAC은 다른 물건이다

일반 해시(MD5·SHA-1·SHA-256 등)는 비밀키가 없습니다. 같은 입력이면 누구나 같은 값을 계산할 수 있으므로, "이 메시지는 진짜 이 사람이 보냈다"는 인증(authentication)을 증명하는 데는 아무리 충돌 저항성이 완벽해도 쓸 수 없습니다. HMAC(Hash-based Message Authentication Code)은 해시 함수에 비밀키를 결합해, 그 키를 아는 사람만 올바른 값을 만들어낼 수 있도록 설계된 구조입니다. 단순히 "비밀키+메시지"를 이어붙여 해시하는 방식은 길이 확장 공격(length extension attack)에 취약하기 때문에, HMAC은 ipad·opad라는 두 번의 중첩 해싱 구조로 이 취약점을 막습니다. 즉 해시는 "무결성"을, HMAC은 "무결성+인증"을 보장합니다.

4. CRC32는 애초에 암호학적 해시가 아니다

CRC32(순환 중복 검사)는 이더넷 프레임, ZIP 파일, PNG 청크 등에서 널리 쓰이지만, 애초에 암호학적 보안을 목표로 설계되지 않았습니다. 목적은 오직 우발적인 전송·저장 오류 감지이며, 32비트라는 짧은 출력값과 선형적인 수학 구조 때문에 의도적으로 같은 CRC32 값을 갖는 데이터를 만드는 건 사실 상 손쉽습니다. 보안이 조금이라도 필요한 곳에 CRC32를 쓰는 것은 애초에 설계 목적을 벗어난 사용입니다.

정리 표
종류보안 충돌 저항성적합한 용도
MD5 / SHA-1깨짐(의도적 충돌 가능)우발적 손상 감지, 캐시 키, 비보안 체크섬
SHA-256 / SHA-512현재 안전디지털 서명, 인증서, 보안이 필요한 무결성 검증
HMAC(-SHA256 등)해시+비밀키 인증API 서명, 웹훅 검증, 메시지 인증
CRC32암호학적 설계 아님네트워크·파일 포맷의 우발적 오류 검출 전용

자주 묻는 질문

Q. MD5로 비밀번호를 저장해도 되나요?

A. 안 됩니다. 비밀번호 저장은 충돌 저항성보다 더 중요한 문제(레인보우 테이블, 무차별 대입 공격에 대한 저항)가 있어, MD5·SHA-1은 물론 salt 없는 SHA-256조차 부적합합니다. bcrypt·scrypt·Argon2처럼 의도적으로 느리게 설계된 전용 알고리즘을 써야 합니다.

Q. 다운로드 파일 체크섬으로 MD5를 써도 괜찮나요?

A. 배포자가 신뢰할 수 있는 채널(공식 사이트 HTTPS 등)로 체크섬을 제공하고, 목적이 "전송 중 우발적 손상 확인"이라면 MD5도 실용적으로 문제없습니다. 다만 "이 파일이 위변조되지 않았음을 암호학적으로 보증"하려면 SHA-256과 디지털 서명이 필요합니다.

Q. Git은 왜 아직 SHA-1을 쓰나요?

A. Git은 커밋 해시로 여전히 SHA-1을 쓰지만, SHAttered 이후 충돌을 탐지해 방어하는 로직(collision detection)을 추가했고, 장기적으로 SHA-256 저장소로 전환하는 작업이 진행 중입니다. 일반 사용자의 일상적인 커밋 작업에서 실제 공격으로 이어질 가능성은 매우 낮습니다.

Q. HMAC에는 어떤 해시 알고리즘이든 쓸 수 있나요?

A. 이론적으로는 가능하지만(HMAC-MD5, HMAC-SHA1도 존재), 실무에서는 HMAC-SHA256 이상을 권장합니다. HMAC 구조 자체가 길이 확장 공격은 막아주지만, 밑에 깔린 해시 함수의 다른 약점(충돌 등)까지 완전히 상쇄해주진 않기 때문입니다.