해시 함수 종류와 용도 정리 - MD5부터 SHA-256, bcrypt까지 한눈에
비밀번호 저장, 파일 무결성 검사, 데이터 식별까지. 해시 함수가 어디에 쓰이고 어떤 알고리즘을 골라야 하는지 용도별로 정리했습니다.
![]()
파일을 다운로드하면 사이트에 적힌 길고 복잡한 문자열을 본 적이 있을 겁니다. 회원가입을 할 때 입력한 비밀번호가 서버에 그대로 저장되지 않는다는 이야기도 들어봤을 겁니다. 이 두 가지의 공통점이 바로 해시 함수입니다. 이름은 자주 들었지만 막상 어떤 종류가 있고 어디에 써야 하는지 정리된 자료는 찾기 어렵습니다. 그래서 핵심만 추려 정리했습니다.
해시 함수란 무엇인가
해시 함수는 임의 길이의 데이터를 입력받아 고정된 길이의 값으로 변환하는 함수입니다. 입력이 1글자든 1GB 영상이든 결과물의 길이는 항상 같습니다. 이 결과값을 해시값 또는 다이제스트라고 부릅니다.
가장 중요한 특징은 단방향이라는 점입니다. 입력에서 해시값은 쉽게 계산되지만, 해시값에서 원래 입력을 되돌리는 것은 사실상 불가능합니다. 이 점이 인코딩이나 암호화와 구분되는 핵심입니다.
인코딩, 암호화, 해싱의 차이
셋을 자주 혼동합니다. 인코딩은 규칙만 알면 누구나 되돌릴 수 있는 변환입니다. 예를 들어 모스 부호 변환기로 만든 점과 선은 같은 규칙으로 원래 글자로 복원됩니다. 텍스트를 다른 형태로 바꿔주는 텍스트 변환기 역시 양방향 변환입니다. 반면 해싱은 되돌릴 수 없습니다.
- 인코딩: 양방향, 가독성과 호환성을 위한 변환 (Base64, 모스 부호 등)
- 암호화: 양방향, 키가 있어야 복호화 가능 (AES, RSA 등)
- 해싱: 단방향, 복원 불가 (SHA, bcrypt 등)
대표적인 해시 함수 종류
해시 함수는 출력 길이와 보안 강도, 속도에 따라 종류가 나뉩니다. 현재 실무에서 마주치는 주요 알고리즘을 표로 정리했습니다.
| 알고리즘 | 출력 길이 | 현재 상태 | 주 용도 |
|---|---|---|---|
| MD5 | 128비트 | 충돌 발견, 보안용 폐기 | 비보안 체크섬 |
| SHA-1 | 160비트 | 충돌 발견, 폐기 권고 | 레거시 호환 |
| SHA-256 | 256비트 | 안전, 표준 | 무결성, 서명, 블록체인 |
| SHA-512 | 512비트 | 안전 | 고보안 무결성 |
| SHA-3 | 가변 | 안전, 최신 표준 | 차세대 대안 |
| bcrypt | 184비트 | 안전, 느림 | 비밀번호 저장 |
| CRC32 | 32비트 | 보안용 아님 | 전송 오류 검출 |
여기서 헷갈리지 말아야 할 점이 있습니다. MD5나 CRC32가 나쁜 알고리즘이라는 뜻은 아닙니다. 보안 목적에 부적합할 뿐, 단순 파일 식별이나 오류 검출에는 여전히 빠르고 유용합니다. 용도가 다른 것입니다.
해시 함수에 절대적인 우열은 없습니다. "가장 안전한 해시"가 아니라 "이 용도에 맞는 해시"를 고르는 것이 핵심입니다.
용도별로 보는 해시 함수
같은 해시 함수라도 쓰임새는 크게 세 갈래로 나뉩니다.
1. 파일 무결성 검사
대용량 파일을 받았을 때 중간에 손상되거나 변조되지 않았는지 확인하는 용도입니다. 배포자가 공개한 해시값과 내가 받은 파일의 해시값이 같으면 동일한 파일입니다. 이때는 SHA-256이 사실상 표준입니다. 리눅스 배포판 ISO, 오픈소스 릴리스에서 흔히 봅니다.
2. 데이터 식별과 중복 제거
대량의 데이터에서 같은 내용을 빠르게 찾을 때 해시를 키로 사용합니다. 보안이 필요 없고 속도가 중요하면 MD5나 더 빠른 비암호학적 해시를 씁니다. 데이터베이스 인덱싱, 캐시 키 생성이 대표 사례입니다.
3. 디지털 서명과 블록체인
전자서명은 문서 전체가 아니라 문서의 해시값에 서명합니다. 블록체인은 이전 블록의 해시를 다음 블록에 담아 위변조를 막습니다. 두 영역 모두 SHA-256 계열이 중심입니다.
비밀번호 저장에 쓰는 해시 함수
비밀번호 저장은 별도로 다뤄야 합니다. SHA-256 같은 일반 해시는 너무 빠른 것이 오히려 약점이 됩니다. 공격자가 초당 수십억 개의 후보를 대입할 수 있기 때문입니다.
그래서 비밀번호에는 일부러 느리게 설계된 해시를 씁니다.
- bcrypt: 가장 널리 쓰이는 검증된 선택지. 비용 인자로 연산 속도를 조절합니다.
- scrypt: 메모리를 많이 쓰도록 설계해 전용 하드웨어 공격에 강합니다.
- Argon2: 2015년 패스워드 해싱 공모전 우승작으로, 현재 신규 설계에서 권장됩니다.
여기에 솔트(salt)가 반드시 더해집니다. 사용자마다 다른 무작위 값을 비밀번호에 섞어 해싱하면, 같은 비밀번호라도 저장되는 해시값이 달라집니다. 이렇게 하면 미리 계산된 해시 테이블(레인보우 테이블) 공격이 무력화됩니다.
해시 함수 사용 시 주의사항
마지막으로 실수하기 쉬운 부분을 짚겠습니다.
첫째, MD5와 SHA-1은 비밀번호나 서명에 쓰지 않습니다. 충돌 공격이 실제로 가능해진 알고리즘입니다. 파일 식별 정도에만 제한적으로 사용합니다.
둘째, 일반 해시로 비밀번호를 저장하지 않습니다. 속도가 빠른 SHA-256조차 비밀번호 저장에는 부적합합니다. 반드시 bcrypt, scrypt, Argon2 중 하나를 쓰십시오.
셋째, 해시는 암호화가 아닙니다. 되돌려야 하는 데이터라면 해시가 아니라 암호화를 써야 합니다. 둘을 혼동하면 설계 자체가 틀어집니다.
정리하면 두 가지만 기억하면 됩니다. 무결성과 식별에는 SHA-256을 기본으로 쓰고, 비밀번호 저장에는 bcrypt나 Argon2를 쓰는 것입니다. 지금 운영 중인 서비스가 있다면 비밀번호가 어떤 방식으로 저장되는지부터 확인해 보시기 바랍니다.