← 블로그

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

2026년 1월 15일 · 8분 읽기

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

해시, 대체 뭔가요?

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

"hello" → 5d41402abc4b2a76b9719d911017c592

"hello!" → 9a2b7f2a7c8e9f0d1b2c3d4e5f6a7b8c

느낌표 하나 추가했을 뿐인데 결과가 완전히 다르죠? 이게 해시의 핵심입니다.

"a" "hello" "The quick brown fox…" 길이가 제각각인 입력 해시 함수 SHA-256 ca978112ca1b…ee48bb 2cf24dba5fb0…8b9824 d7a8fbb307d7…c9e592 항상 같은 길이 — 256비트(64자) 눈사태 효과 (Avalanche Effect) hello 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c… hallo d3751d33f9cd5049c4af2b462735457e4d3baf13… 입력은 한 글자(e→a) 차이지만 두 해시는 전혀 닮지 않았습니다.
해시 함수는 어떤 길이의 입력이든 고정 길이 지문으로 바꾸고, 입력이 조금만 달라져도 결과가 완전히 달라집니다.

해시의 세 가지 특징

해시 함수가 유용한 이유는 이 세 가지 특징 때문입니다:

  • 단방향성: 해시값에서 원본을 역산할 수 없습니다. 지문으로 사람을 복제할 수 없는 것처럼요.
  • 결정성: 같은 입력은 항상 같은 해시를 생성합니다. 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 (보안 무관시)

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

자주 묻는 질문

해시 함수와 암호화의 차이는 무엇인가요?

해시 함수는 단방향 함수로, 원본 데이터를 복원할 수 없습니다. 암호화는 키를 사용하여 데이터를 변환하고, 올바른 키가 있으면 원본을 복원할 수 있습니다. 해시는 데이터 무결성 검증과 비밀번호 저장에, 암호화는 데이터 보호에 사용됩니다.

MD5는 왜 안전하지 않나요?

MD5는 충돌 공격에 취약합니다. 2004년 왕샤오윈 교수팀이 같은 해시값을 가진 서로 다른 입력을 빠르게 찾는 방법을 발견했습니다. 현재 MD5는 파일 체크섬 등 보안이 중요하지 않은 용도로만 사용하고, 보안 용도에는 SHA-256 이상을 권장합니다.

솔트(Salt)란 무엇인가요?

솔트는 비밀번호 해싱 시 추가하는 무작위 문자열입니다. 같은 비밀번호라도 솔트가 다르면 해시값이 달라져 레인보우 테이블 공격을 방지합니다. 각 사용자마다 고유한 솔트를 사용하는 것이 중요합니다. bcrypt, Argon2 같은 현대적 해싱 알고리즘은 솔트를 자동으로 관리합니다.

SHA-256과 SHA-512 중 어떤 것을 사용해야 하나요?

SHA-256은 대부분의 용도에 충분한 보안성을 제공합니다. SHA-512는 64비트 시스템에서 더 빠를 수 있고, 더 긴 해시값이 필요한 경우 유용합니다. 비트코인은 SHA-256을, 일부 리눅스 배포판은 비밀번호에 SHA-512를 사용합니다.

해시 충돌이란 무엇인가요?

서로 다른 두 입력이 같은 해시값을 생성하는 현상입니다. 비둘기집 원리에 의해 이론적으로 항상 존재하지만, 좋은 해시 함수는 의도적으로 충돌을 만들기 극도로 어렵게 설계됩니다. SHA-256의 경우 2^128번의 연산이 필요하여 현재 기술로는 사실상 불가능합니다.