보안 · 8분 읽기

해시 함수 완벽 가이드: MD5 vs SHA-256

파일 무결성 검증부터 비밀번호 저장까지, 해시 함수가 왜 중요한지 그리고 어떤 상황에서 어떤 알고리즘을 선택해야 하는지 알아봅니다.

해시 함수란 무엇인가?

해시 함수(Hash Function)는 임의 길이의 데이터를 고정 길이의 문자열(해시값 또는 다이제스트)로 변환하는 수학적 함수입니다. 핵심 특징은 세 가지입니다. 첫째, 결정론적(Deterministic)입니다. 같은 입력에는 항상 같은 출력이 나옵니다. 둘째, 단방향성(One-way)입니다. 해시값에서 원래 데이터를 역산하는 것이 계산상 불가능합니다. 셋째, 눈사태 효과(Avalanche Effect)입니다. 입력 데이터를 1비트만 바꿔도 출력 해시값이 완전히 달라집니다.

예를 들어 "hello"를 SHA-256으로 해시하면 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824가 됩니다. "Hello"(대문자 H)로 바꾸면 전혀 다른 해시값이 나옵니다. 이 특성이 해시 함수를 보안에 유용하게 만듭니다.

MD5는 왜 더 이상 안전하지 않을까?

MD5(Message Digest Algorithm 5)는 1991년 Ron Rivest가 설계했으며 128비트(32자 헥스 문자열) 해시를 생성합니다. 한때 광범위하게 사용되었지만, 2004년 충돌(Collision) 공격이 실용적으로 가능하다는 것이 증명되었습니다. 충돌이란 서로 다른 두 입력이 같은 해시값을 내는 경우입니다.

2008년에는 MD5 충돌을 이용해 가짜 SSL 인증서를 만드는 공격이 실제로 시연되었고, 2012년 Flame 악성코드는 MD5 충돌을 악용해 마이크로소프트의 공식 서명인 것처럼 위장했습니다. 현재 MD5 충돌은 일반 노트북에서 몇 초 내로 생성할 수 있습니다.

그렇다면 MD5는 언제 써도 괜찮을까요? 보안이 전혀 필요 없는 단순 체크섬 용도로는 여전히 사용할 수 있습니다. 예를 들어 대용량 파일을 다운로드한 후 전송 중 비트 오류가 없었는지 확인하는 무결성 검사, 또는 캐시 키 생성 같은 내부 식별자 목적에서는 MD5가 빠르고 충분합니다. 단, 보안 목적으로는 절대 사용하면 안 됩니다.

SHA 계열 알고리즘 비교

알고리즘출력 길이속도보안 상태권장 용도
SHA-1160비트빠름취약 (2017년 충돌 증명)사용 중단 권고
SHA-256256비트보통안전범용, 파일 무결성, 인증서
SHA-512512비트느림매우 안전고보안 데이터 서명
SHA-3가변느림매우 안전미래 대비 시스템

실전 사용 사례

파일 무결성 검증: 대용량 소프트웨어를 배포할 때 개발사는 SHA-256 해시를 함께 공개합니다. 사용자가 다운로드 후 해시를 직접 계산해서 비교하면, 전송 중 파일이 변조되거나 손상되지 않았음을 확인할 수 있습니다. Linux 배포판 ISO 파일을 받을 때 제공되는 SHA256SUM 파일이 대표적인 예입니다.

비밀번호 저장 (주의 필요): 데이터베이스에 비밀번호를 그대로 저장하면 DB가 해킹될 때 모든 사용자 비밀번호가 노출됩니다. 해시를 저장하면 원문을 알 수 없습니다. 그러나 SHA-256만으로는 부족합니다. 레인보우 테이블(Rainbow Table) 공격을 막기 위해 반드시 bcrypt, Argon2, scrypt 같은 비밀번호 전용 해시 함수를 사용해야 합니다. 이 함수들은 의도적으로 느리게 설계되어 브루트포스 공격을 어렵게 만듭니다.

API 서명 & HMAC: AWS, 카카오 등 많은 API는 요청 변조를 막기 위해 HMAC(Hash-based Message Authentication Code)을 사용합니다. 요청 본문을 비밀 키와 함께 SHA-256으로 해시하고, 그 결과를 Authorization 헤더에 담아 전송합니다.

파일 또는 텍스트의 해시값을 바로 확인하려면 해시 생성기 도구를 사용하세요. MD5, SHA-1, SHA-256, SHA-512를 모두 지원합니다.