처음 개발을 배울 때 "비밀번호는 해시로 저장해야 한다"는 말을 듣고 고개만 끄덕였던 기억이 납니다. 해시가 뭔지도 모르면서요. 이 글에서는 제가 그때 알았으면 좋았을 내용들을 정리해봤습니다.
해시, 대체 뭔가요?
쉽게 말하면, 해시는 어떤 데이터를 고정된 길이의 "지문"으로 바꿔주는 함수입니다. 사람의 지문처럼, 입력이 조금만 달라도 완전히 다른 결과가 나옵니다.
"hello" → 5d41402abc4b2a76b9719d911017c592
"hello!" → 9a2b7f2a7c8e9f0d1b2c3d4e5f6a7b8c
느낌표 하나 추가했을 뿐인데 결과가 완전히 다르죠? 이게 해시의 핵심입니다.
해시의 세 가지 특징
해시 함수가 유용한 이유는 이 세 가지 특징 때문입니다:
- 단방향성: 해시값에서 원본을 역산할 수 없습니다. 지문으로 사람을 복제할 수 없는 것처럼요.
- 결정성: 같은 입력은 항상 같은 해시를 생성합니다. 100번 해도 같습니다.
- 충돌 저항성: 다른 입력이 같은 해시를 만드는 건 (이론상) 거의 불가능합니다.
MD5 - 빠르지만 은퇴할 때가 됐어요
MD5는 1991년에 만들어진 해시 알고리즘입니다. 128비트(32자) 해시를 생성하고, 속도가 빠릅니다.
문제는 2004년에 충돌이 발견됐다는 겁니다. 즉, 다른 입력으로 같은 해시를 만들 수 있게 된 거죠. 보안 용도로는 더 이상 쓰면 안 됩니다.
그래도 쓸 수 있는 곳: 파일 체크섬, 캐시 키 생성, 중복 파일 검사 등 보안과 무관한 곳에서는 여전히 유용합니다. 빠르니까요.
SHA-1 - 레거시 호환용
SHA-1은 160비트(40자) 해시를 생성합니다. MD5보다 안전하다고 알려졌지만, 2017년 Google이 충돌 공격에 성공했습니다.
Git이 SHA-1을 쓰는 건 유명한데요, 보안 때문이 아니라 커밋을 구분하기 위한 용도라 괜찮습니다. 물론 Git도 SHA-256으로 이전 중이긴 합니다.
SHA-256 - 현재의 표준
SHA-256은 256비트(64자) 해시를 생성합니다. 비트코인, SSL 인증서, 대부분의 보안 시스템이 사용하는 현재 표준입니다.
충돌 공격이 아직 성공한 적이 없고, 당분간 안전할 것으로 예상됩니다. 뭘 써야 할지 모르겠으면 SHA-256 쓰세요.
SHA-512 - 더 높은 보안이 필요할 때
512비트(128자) 해시입니다. SHA-256보다 길고, 64비트 시스템에서 오히려 더 빠른 경우도 있습니다.
일반적인 용도에는 과한 감이 있지만, 장기 보관이나 극도로 높은 보안이 필요할 때 사용합니다.
실전: 언제 뭘 쓰나요?
| 용도 | 추천 알고리즘 | 이유 |
|---|---|---|
| 비밀번호 저장 | bcrypt, Argon2 | 일반 해시는 너무 빨라서 무차별 대입에 취약 |
| 파일 무결성 | SHA-256 | 표준이고 안전함 |
| 캐시 키 | MD5 | 빠르고, 보안 불필요 |
| 디지털 서명 | SHA-256+ | 충돌 저항성 필수 |
| 블록체인 | SHA-256 | 비트코인 표준 |
흔한 실수들
1. 비밀번호에 일반 해시 사용
SHA-256도 비밀번호 저장에는 부적합합니다. 너무 빨라서 초당 수십억 개의 해시를 시도할 수 있거든요. bcrypt나 Argon2처럼 의도적으로 느린 해시를 쓰세요.
2. Salt 없이 해시
"password123"의 SHA-256 해시는 누구나 똑같습니다. 레인보우 테이블로 역추적 가능해요. 반드시 무작위 salt를 추가해서 해시하세요.
3. MD5를 보안에 사용
2024년에 MD5를 인증이나 서명에 쓰는 건... 그냥 안 됩니다. 체크섬 용도 외에는 쓰지 마세요.
마무리
정리하면:
- 비밀번호 → bcrypt/Argon2
- 보안이 필요한 해시 → SHA-256
- 빠른 체크섬 → MD5 (보안 무관시)
해시는 간단한 개념이지만, 제대로 이해하고 쓰면 많은 문제를 예방할 수 있습니다.