← 블로그

해시 함수 완벽 가이드: MD5부터 SHA-512까지

2025년 1월 25일 · 8분 읽기

처음 개발을 배울 때 "비밀번호는 해시로 저장해야 한다"는 말을 듣고 고개만 끄덕였던 기억이 납니다. 해시가 뭔지도 모르면서요. 이 글에서는 제가 그때 알았으면 좋았을 내용들을 정리해봤습니다.

해시, 대체 뭔가요?

쉽게 말하면, 해시는 어떤 데이터를 고정된 길이의 "지문"으로 바꿔주는 함수입니다. 사람의 지문처럼, 입력이 조금만 달라도 완전히 다른 결과가 나옵니다.

"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 (보안 무관시)

해시는 간단한 개념이지만, 제대로 이해하고 쓰면 많은 문제를 예방할 수 있습니다.