Skip to main content
KO
guide

What Are Hash Functions? — From SHA-256 and MD5 to Password Security

2026-04-07 · 7 min read

해시 함수란?

해시 함수를 가장 쉽게 이해하는 방법은 디지털 지문에 비유하는 것입니다. 사람의 지문이 각 개인을 고유하게 식별하듯, 해시 함수는 임의의 데이터를 입력받아 고정된 길이의 고유한 문자열(해시값)을 출력합니다.

예를 들어 “안녕하세요”라는 텍스트를 SHA-256 해시 함수에 넣으면, 항상 동일한 64자리 16진수 문자열이 나옵니다. 입력이 한 글자라도 달라지면 완전히 다른 해시값이 생성됩니다.

해시 함수의 가장 중요한 특성은 단방향성입니다. 원본 데이터에서 해시값을 구하는 것은 쉽지만, 해시값에서 원본 데이터를 역추적하는 것은 사실상 불가능합니다. 이 특성 덕분에 해시 함수는 보안, 데이터 무결성, 암호화폐 등 다양한 분야에서 핵심적인 역할을 합니다.


해시 함수의 핵심 특성

해시 함수가 보안과 데이터 처리에서 널리 사용되는 이유는 다음 네 가지 핵심 특성 때문입니다.

1. 단방향성 (One-way)

해시값에서 원본 데이터를 복원할 수 없습니다. 수학적으로 역연산이 불가능하도록 설계되어 있어, 해시값만으로는 원래 입력을 알아낼 수 없습니다. 이 특성이 비밀번호 저장에 해시를 사용하는 근본적인 이유입니다.

2. 결정적 (Deterministic)

같은 입력에 대해 항상 같은 해시값이 출력됩니다. 시간, 환경, 횟수에 관계없이 동일한 데이터를 넣으면 동일한 결과가 나옵니다. 이 특성 덕분에 파일 무결성 검증이 가능합니다.

3. 눈사태 효과 (Avalanche Effect)

입력의 아주 작은 변화(1비트라도)가 출력에 큰 변화를 일으킵니다. “hello”와 “Hello”의 해시값은 완전히 다릅니다. 이 때문에 해시값만 보고 원본 데이터를 유추하는 것이 불가능에 가깝습니다.

4. 충돌 저항성 (Collision Resistance)

서로 다른 두 입력이 같은 해시값을 만들어내는 경우를 **충돌(collision)**이라 합니다. 좋은 해시 함수는 충돌을 찾는 것이 계산적으로 불가능하도록 설계됩니다. 충돌이 발견된 알고리즘(MD5, SHA-1)은 보안 용도에서 퇴출됩니다.


주요 해시 알고리즘 비교

현재 널리 사용되는 해시 알고리즘들을 비교해 보겠습니다.

알고리즘출력 길이보안 수준현재 상태
MD5128비트 (32자)취약보안 용도 사용 금지
SHA-1160비트 (40자)취약공식 폐기 (2017~)
SHA-256256비트 (64자)안전현재 표준
SHA-512512비트 (128자)매우 안전고보안 환경 사용

MD5 (128비트)

1991년에 개발된 MD5는 한때 가장 널리 사용되던 해시 알고리즘이었습니다. 하지만 2004년에 충돌이 발견되었고, 현재는 보안 목적으로 절대 사용해서는 안 됩니다. 파일 체크섬 등 비보안 용도로만 제한적으로 사용됩니다.

SHA-1 (160비트)

MD5의 대안으로 등장했지만, 2017년 Google이 실제 충돌 사례(SHAttered)를 공개하면서 공식 폐기되었습니다. 주요 브라우저와 CA(인증 기관)들은 SHA-1 기반 SSL 인증서를 더 이상 신뢰하지 않습니다.

SHA-256 (256비트)

SHA-2 계열에 속하는 SHA-256은 현재 가장 널리 사용되는 보안 해시 알고리즘입니다. 비트코인 블록체인, SSL/TLS 인증서, 디지털 서명 등에서 표준으로 채택되고 있습니다. 2^128 수준의 충돌 저항성을 제공하며, 현존하는 컴퓨터로는 충돌을 찾는 것이 불가능합니다.

SHA-512 (512비트)

SHA-256보다 더 긴 해시값을 생성하여 높은 보안 수준을 제공합니다. 64비트 프로세서에서는 SHA-256보다 오히려 빠르게 동작하는 경우도 있어, 고보안이 필요한 서버 환경에서 선호됩니다.


비밀번호 보안과 해시

왜 비밀번호를 평문으로 저장하면 안 되나?

데이터베이스가 유출되면 모든 사용자의 비밀번호가 그대로 노출됩니다. 2012년 LinkedIn 해킹 사건에서는 약 650만 개의 비밀번호가 평문에 가까운 형태로 유출되어 큰 피해를 입혔습니다. 비밀번호를 해시로 저장하면, 데이터베이스가 유출되더라도 원본 비밀번호를 알아내기 어렵습니다.

솔트(Salt)의 중요성

단순히 해시만 적용하면 레인보우 테이블 공격에 취약합니다. 레인보우 테이블은 자주 사용되는 비밀번호의 해시값을 미리 계산해 놓은 거대한 데이터베이스입니다. 공격자가 해시값을 테이블에서 검색하면 원본 비밀번호를 빠르게 찾을 수 있습니다.

**솔트(salt)**는 각 비밀번호에 추가하는 랜덤한 문자열입니다. 같은 비밀번호라도 솔트가 다르면 해시값이 완전히 달라지므로, 레인보우 테이블 공격을 무력화할 수 있습니다.

비밀번호 전용 해시 함수

SHA-256 같은 범용 해시 함수는 비밀번호 저장에 적합하지 않습니다. 너무 빨라서 공격자가 초당 수십억 개의 해시를 시도(브루트포스)할 수 있기 때문입니다. 비밀번호용으로는 의도적으로 느린 해시 함수를 사용해야 합니다.

  • bcrypt: 가장 오래되고 검증된 비밀번호 해시. 비용 인자(cost factor)로 속도를 조절합니다.
  • scrypt: bcrypt에 메모리 요구량을 추가하여 GPU 기반 공격에 더 강합니다.
  • Argon2: 2015년 Password Hashing Competition 우승 알고리즘. 시간, 메모리, 병렬성을 모두 조절 가능하여 현재 가장 권장됩니다.

안전한 비밀번호 관리에 대해 더 알아보려면 비밀번호 보안 가이드도 참고해 보세요.


파일 무결성 검증

해시 함수의 가장 실용적인 활용 중 하나는 파일 무결성 검증입니다.

다운로드 파일 체크섬

소프트웨어를 배포할 때 공식 사이트에서 파일의 SHA-256 해시값을 함께 제공하는 경우가 많습니다. 다운로드한 파일의 해시값을 계산하여 공식 값과 비교하면, 파일이 전송 중에 손상되거나 악의적으로 변조되지 않았는지 확인할 수 있습니다.

# Linux/Mac에서 파일 SHA-256 확인
sha256sum downloaded-file.iso

# Windows PowerShell에서
Get-FileHash downloaded-file.iso -Algorithm SHA256

ISO 이미지 확인

Linux 배포판의 ISO 이미지를 다운로드할 때, 공식 사이트에서 제공하는 SHA-256 체크섬과 비교하는 것은 보안의 기본입니다. 미러 사이트에서 다운로드할 경우 특히 중요합니다.

Git의 SHA-1 활용

Git은 모든 커밋, 파일(blob), 트리, 태그를 SHA-1 해시로 식별합니다. 커밋 해시 a1b2c3d...가 바로 그것입니다. 이를 통해 저장소의 모든 변경 이력의 무결성이 보장됩니다. Git은 점진적으로 SHA-256으로 전환을 진행하고 있습니다.


블록체인과 해시

블록체인 기술에서 해시 함수는 근본적인 구성 요소입니다.

작업 증명 (Proof of Work)

비트코인의 채굴 과정은 본질적으로 특정 조건을 만족하는 해시값을 찾는 작업입니다. 채굴자들은 블록 데이터에 임의의 숫자(nonce)를 붙여 SHA-256 해시를 반복 계산하며, 해시값이 목표 난이도(앞에 0이 일정 개수 이상) 이하인 nonce를 찾습니다.

머클 트리 (Merkle Tree)

블록 내의 모든 거래(트랜잭션)는 머클 트리라는 구조로 해시됩니다. 개별 거래의 해시를 쌍으로 묶어 상위 해시를 만들고, 이를 반복하여 최종 머클 루트(Merkle Root)를 얻습니다. 이 구조 덕분에 하나의 거래라도 변조되면 머클 루트가 달라져 즉시 감지할 수 있습니다.

비트코인의 SHA-256

비트코인은 SHA-256을 이중으로(SHA-256d) 적용합니다. 블록 헤더 해싱, 거래 ID 생성, 주소 생성 등 거의 모든 핵심 연산에 SHA-256이 사용됩니다. 이더리움은 Keccak-256(SHA-3 계열)을 사용하는 등, 각 블록체인마다 채택한 해시 알고리즘이 다릅니다.


개발 실무에서의 해시

웹 개발과 소프트웨어 엔지니어링에서 해시 함수는 보안 외에도 다양한 용도로 활용됩니다.

API 키 서명 (HMAC)

HMAC(Hash-based Message Authentication Code)은 해시 함수에 비밀 키를 결합하여 메시지 인증을 수행합니다. REST API에서 요청의 무결성과 인증을 동시에 보장하며, AWS, Stripe 등 주요 서비스의 API 서명에 HMAC-SHA256이 표준으로 사용됩니다.

캐시 키 생성

해시 함수를 사용하면 복잡한 데이터 구조를 짧고 일관된 캐시 키로 변환할 수 있습니다. 요청 파라미터, 쿼리 문자열, 설정 조합 등을 해시하여 캐시의 키로 사용하면, 효율적인 캐시 관리가 가능합니다.

데이터 중복 확인

대용량 파일 시스템이나 클라우드 스토리지에서는 파일의 해시값을 비교하여 중복을 감지합니다. Dropbox, Google Drive 같은 서비스에서 같은 파일을 여러 번 업로드해도 저장 공간을 낭비하지 않는 것이 바로 해시 기반 중복 제거(deduplication) 덕분입니다.

ETag (HTTP 캐싱)

웹 서버는 응답에 ETag 헤더를 포함하여 리소스의 버전을 식별합니다. ETag은 주로 콘텐츠의 해시값으로 생성됩니다. 브라우저가 캐시된 리소스를 재요청할 때 ETag을 함께 보내면, 서버는 콘텐츠가 변경되지 않았을 경우 304 응답으로 대역폭을 절약할 수 있습니다.

개발자를 위한 더 많은 유용한 도구와 활용법은 웹 개발자 필수 온라인 도구에서 확인해 보세요.


마무리

해시 함수는 현대 디지털 보안의 근간을 이루는 기술입니다. 비밀번호 보호, 파일 무결성 검증, 블록체인, API 인증에 이르기까지 — 우리가 매일 사용하는 서비스의 뒤에서 해시 함수가 조용히 작동하고 있습니다.

해시 알고리즘의 선택은 용도에 따라 달라집니다. 범용 보안에는 SHA-256, 비밀번호 저장에는 Argon2(또는 bcrypt), 비보안 체크섬에는 MD5도 여전히 사용 가능합니다. 중요한 것은 각 알고리즘의 특성과 한계를 이해하고, 적절한 상황에 올바르게 적용하는 것입니다.

직접 텍스트의 해시값을 생성하고 비교해 보고 싶다면, 해시 생성기를 사용해 보세요. SHA-1, SHA-256, SHA-512 해시를 간편하게 생성할 수 있습니다.