해시 함수 종류와 용도 완벽 정리 - MD5부터 SHA-3까지 한눈에 비교
MD5, SHA-1, SHA-256, SHA-3, bcrypt까지 주요 해시 함수의 특징과 용도를 비교하고, 실무에서 어떤 상황에 어떤 알고리즘을 선택해야 하는지 정리했습니다.
![]()
파일을 다운로드한 뒤 '이 파일이 정말 원본과 같은 건가?' 의문을 품어본 적 있으신가요? 비밀번호를 저장할 때 평문 그대로 데이터베이스에 넣으면 위험하다는 건 알지만, 구체적으로 어떤 방식으로 변환해야 하는지 고민되셨을 겁니다. 이 모든 상황에서 핵심 역할을 하는 기술이 바로 해시 함수입니다. 해시 함수 종류와 용도를 제대로 이해하면 보안 설계부터 데이터 검증까지 훨씬 정확한 판단을 내릴 수 있습니다.
해시 함수란 무엇인가
해시 함수는 임의 길이의 입력 데이터를 고정 길이의 출력값(해시값)으로 변환하는 수학적 함수입니다. 같은 입력에는 항상 같은 출력이 나오고, 출력값만으로는 원래 입력을 역추적할 수 없다는 특성이 있습니다.
해시 함수의 3가지 핵심 성질
- 역상 저항성 - 해시값으로부터 원본 데이터를 찾는 것이 계산적으로 불가능합니다
- 제2역상 저항성 - 특정 입력과 같은 해시값을 만드는 다른 입력을 찾기 어렵습니다
- 충돌 저항성 - 같은 해시값을 내는 서로 다른 두 입력을 찾는 것이 극히 어렵습니다
예를 들어 "hello"라는 문자열을 SHA-256으로 해싱하면 항상 64자리 16진수 문자열이 나옵니다. "hello"에서 글자 하나만 바꿔 "hallo"로 입력해도 완전히 다른 결과가 출력됩니다. 이런 성질을 눈사태 효과(Avalanche Effect)라고 부릅니다.
주요 해시 함수 종류 비교
현재 널리 사용되는 해시 함수 종류를 출력 길이, 보안성, 속도 기준으로 정리했습니다.
| 알고리즘 | 출력 길이 | 보안 상태 | 속도 | 주요 용도 |
|---|---|---|---|---|
| MD5 | 128비트 | 취약 (충돌 발견) | 매우 빠름 | 체크섬 (비보안) |
| SHA-1 | 160비트 | 취약 (2017년 충돌 실증) | 빠름 | 레거시 시스템 |
| SHA-256 | 256비트 | 안전 | 보통 | 디지털 서명, 블록체인 |
| SHA-512 | 512비트 | 안전 | 64비트 CPU에서 빠름 | 높은 보안 요구 환경 |
| SHA-3(Keccak) | 가변(224~512비트) | 안전 | 보통 | 차세대 보안 시스템 |
| bcrypt | 184비트 | 안전 | 의도적으로 느림 | 비밀번호 저장 |
| Argon2 | 가변 | 매우 안전 | 의도적으로 느림 | 비밀번호 저장 (최신) |
MD5 - 빠르지만 보안용으로는 부적격
MD5는 1991년 로널드 리베스트가 설계한 해시 함수입니다. 128비트 출력을 생성하며 처리 속도가 매우 빠릅니다. 하지만 2004년 충돌 공격이 실증된 이후 보안 목적으로는 사용이 권장되지 않습니다. 파일 다운로드 후 무결성 확인처럼 악의적 공격을 고려하지 않아도 되는 상황에서만 활용합니다.
SHA-2 계열 - 현재 표준
SHA-256과 SHA-512를 포함하는 SHA-2 패밀리는 미국 국가안보국(NSA)이 설계했습니다. SHA-256은 비트코인 채굴, TLS 인증서, 코드 서명 등 현재 가장 광범위하게 쓰이는 해시 알고리즘입니다. 2026년 현재까지 실질적인 충돌 공격 사례가 보고되지 않았습니다.
SHA-3 - 구조적으로 다른 차세대 표준
SHA-3는 2015년 NIST가 표준으로 지정한 해시 함수입니다. SHA-2와는 완전히 다른 내부 구조(스펀지 구조)를 사용합니다. SHA-2가 아직 안전하기 때문에 당장 교체가 시급하지는 않지만, SHA-2에서 취약점이 발견될 경우를 대비한 대안입니다.
해시 함수 종류와 용도를 선택할 때 가장 중요한 기준은 '속도'가 아니라 '목적'입니다. 빠른 해시가 항상 좋은 것이 아닙니다. 비밀번호 저장처럼 의도적으로 느려야 안전한 경우도 있습니다.
용도별 해시 함수 선택 가이드
같은 해시 함수라도 용도에 따라 적합성이 완전히 달라집니다. 상황별로 어떤 알고리즘을 선택해야 하는지 정리합니다.
1. 비밀번호 저장
비밀번호 해싱에는 반드시 느린 해시 함수를 사용해야 합니다. bcrypt, scrypt, Argon2가 대표적입니다. SHA-256 같은 범용 해시 함수는 GPU를 활용한 무차별 대입 공격에 취약합니다. bcrypt는 work factor를 조절할 수 있어 하드웨어 성능이 올라가도 연산 비용을 함께 높일 수 있습니다.
- 권장: Argon2id (메모리 하드 함수, Password Hashing Competition 우승)
- 차선: bcrypt (work factor 12 이상)
- 금지: MD5, SHA-1, SHA-256 단독 사용
2. 파일 무결성 검증
소프트웨어 배포 시 다운로드 파일이 변조되지 않았는지 확인하는 용도입니다. SHA-256이 현재 표준이며, 속도가 중요한 대용량 파일 체크섬에는 BLAKE3도 좋은 선택입니다.
3. 디지털 서명과 인증서
TLS/SSL 인증서, 코드 서명에는 SHA-256 이상이 필수입니다. 구글 크롬은 2017년부터 SHA-1 인증서를 신뢰하지 않으며, 모든 주요 브라우저가 동일한 정책을 적용하고 있습니다.
4. 데이터 구조와 캐싱
해시 테이블, 캐시 키 생성, 데이터 중복 제거 같은 비보안 목적에는 속도가 빠른 해시 함수가 유리합니다. MurmurHash3, xxHash, CityHash 등이 이 영역에서 활발히 사용됩니다. 웹 개발에서 URL이나 쿼리 파라미터를 캐시 키로 변환할 때도 이런 빠른 해시가 쓰입니다. 참고로 URL에 특수문자가 포함된 경우 해싱 전에 인코딩 처리가 필요한데, URL 인코더 같은 도구를 활용하면 특수문자를 퍼센트 인코딩으로 빠르게 변환할 수 있습니다.
해시 충돌과 보안 취약점
해시 충돌이란 서로 다른 두 입력이 동일한 해시값을 만들어내는 현상입니다. 이론적으로 모든 해시 함수에서 충돌은 존재할 수밖에 없습니다. 입력은 무한한데 출력 길이는 고정되어 있기 때문입니다. 문제는 충돌을 '의도적으로 만들어낼 수 있느냐'입니다.
실제 충돌 공격 사례
- MD5 - 2004년 왕샤오윈 교수 팀이 충돌 쌍을 발견했습니다. 이후 2008년에는 가짜 CA 인증서를 만드는 데 성공한 사례도 보고되었습니다
- SHA-1 - 2017년 구글과 CWI 암스테르담 연구팀이 'SHAttered' 공격으로 서로 다른 두 PDF 파일이 같은 SHA-1 해시값을 갖도록 만들었습니다. 약 6,500 CPU-년에 해당하는 연산이 필요했습니다
- SHA-256 - 2026년 현재까지 실질적인 충돌 공격이 보고되지 않았습니다
솔트(Salt)의 중요성
같은 비밀번호라도 사용자마다 다른 해시값이 나오도록 랜덤 문자열(솔트)을 추가하는 기법입니다. 솔트가 없으면 레인보우 테이블 공격으로 흔한 비밀번호의 해시값을 미리 계산해둔 뒤 대조하는 방식으로 비밀번호를 탈취할 수 있습니다. bcrypt와 Argon2는 내부적으로 솔트를 자동 생성합니다.
실무에서 해시 함수 활용하는 방법
개발 환경별로 해시 함수를 적용하는 구체적인 방법을 살펴봅니다.
Python에서 SHA-256 사용
Python 표준 라이브러리의 hashlib 모듈로 SHA-256 해시를 생성할 수 있습니다. hashlib.sha256(b"data").hexdigest() 한 줄이면 충분합니다. 파일의 무결성을 검증할 때는 파일을 청크 단위로 읽으며 update() 메서드를 반복 호출하는 방식이 메모리 효율적입니다.
데이터베이스 비밀번호 저장
웹 애플리케이션에서 회원가입 시 비밀번호를 저장하는 올바른 흐름은 다음과 같습니다.
- 사용자가 비밀번호 입력
- 서버에서 랜덤 솔트 생성 (16바이트 이상)
- 비밀번호 + 솔트를 Argon2id 또는 bcrypt로 해싱
- 해시값과 솔트를 함께 데이터베이스에 저장
- 로그인 시 동일 과정으로 해시값 비교
Git에서의 해시 활용
Git은 모든 커밋, 파일, 트리 객체를 SHA-1 해시로 식별합니다. 커밋 ID로 보이는 40자리 16진수 문자열이 바로 SHA-1 해시값입니다. Git은 현재 SHA-256으로의 전환을 진행 중이며, Git 2.42부터 실험적으로 SHA-256 리포지토리를 지원합니다.
해시 함수 선택 체크리스트
상황에 맞는 해시 함수를 빠르게 고르기 위한 체크리스트입니다.
| 질문 | 예 | 아니오 |
|---|---|---|
| 비밀번호를 저장하는가? | Argon2id 또는 bcrypt | 다음 질문으로 |
| 보안 목적(서명, 인증)인가? | SHA-256 이상 | 다음 질문으로 |
| 파일 무결성 확인인가? | SHA-256 또는 BLAKE3 | 다음 질문으로 |
| 해시 테이블, 캐시 키인가? | xxHash, MurmurHash3 | SHA-256 기본 선택 |
해시 함수는 소프트웨어 개발의 거의 모든 영역에 관여하는 기초 기술입니다. 해시 함수 종류와 용도를 정확히 알면 보안 사고를 예방하고, 시스템 성능도 최적화할 수 있습니다. 지금 운영 중인 서비스의 비밀번호 저장 방식이 MD5나 SHA-1이라면 즉시 bcrypt 또는 Argon2로 마이그레이션 계획을 세우세요. 파일 검증에는 SHA-256을 기본으로 적용하고, 비보안 용도의 해시는 속도 중심으로 선택하면 됩니다.