해시 가이드: SHA-256·MD5·bcrypt·Argon2 비교
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
목차
해시 함수는 비밀번호 저장, 파일 무결성 검증, 블록체인, 디지털 서명, JWT 토큰 등
현대 보안 시스템 어디에나 등장하는 도구입니다. 그러나 SHA-256만 쓰면 안전한 게 아닙니다. 비밀번호 저장에는 bcrypt·Argon2 같은 느린 해시가 필수이고,
MD5·SHA-1은 충돌 공격이 가능해 보안 용도로는 사용 금지입니다.
이 글은 해시 함수의 원리, 알고리즘별 비교(MD5·SHA-256·SHA-512·bcrypt·Argon2), 비밀번호 해시의 올바른 방법, 파일 무결성 검증,
JavaScript 코드 예제, 그리고 흔한 보안 실수까지 한 번에 정리합니다.
해시 함수란?#
해시 함수(Hash Function)는 임의 길이의 데이터를 고정된 길이의 값(해시값, 다이제스트)으로
변환하는 단방향 함수입니다.
핵심 특성#
- 결정성: 같은 입력 → 항상 같은 출력
- 단방향성: 해시값으로 원본 데이터를 역산 불가(이론적으로)
- 눈사태 효과: 입력의 1비트만 달라져도 해시값이 완전히 달라짐
- 고유성(충돌 저항성): 서로 다른 입력이 같은 해시값을 생성할 확률 극히 낮음
- 고정 길이 출력: 입력이 1바이트든 1GB든 SHA-256은 항상 64자(256비트)
일방향 함수의 의미#
SHA-256("Hello") = 185f8db3...79ec0c0d
이 해시값에서 원본 "Hello"를 복원할 수 없습니다. 단, 해시값을 미리 계산해 둔 레인보우 테이블로 짧은 입력은 역추적 가능합니다(이를 막기 위해 솔트 사용).
주요 해시 알고리즘 비교#
일반 해시(데이터 무결성용)#
| 알고리즘 | 출력 길이 | 현재 상태 | 주요 용도 |
|---|---|---|---|
| MD5 | 128비트(32 hex자) | 보안 취약 | 레거시 파일 체크섬만 |
| SHA-1 | 160비트(40 hex자) | 보안 취약(2017 SHAttered) | 사용 중단 권고 |
| SHA-256 | 256비트(64 hex자) | 안전 | 무결성, 블록체인, TLS |
| SHA-384 | 384비트(96 hex자) | 안전 | 고보안 문서, 전자서명 |
| SHA-512 | 512비트(128 hex자) | 안전 | 고보안 애플리케이션 |
| SHA-3(Keccak) | 가변 | 안전(차세대) | NIST 표준 |
| BLAKE2/BLAKE3 | 가변 | 안전(빠름) | 고성능 무결성 |
비밀번호 해시 전용(느린 해시)#
| 알고리즘 | 발표년도 | 현재 권장 | 특징 |
|---|---|---|---|
| bcrypt | 1999 | 안전 | 비용 인자 조정 가능 |
| scrypt | 2009 | 안전 | 메모리 대역폭 요구 |
| Argon2 | 2015(PHC 우승) | 권장 | 최신 표준, 메모리·CPU·병렬 조정 |
| PBKDF2 | 2000 | 약함 | NIST 표준이나 GPU 공격에 취약 |
핵심: 비밀번호 저장에는 일반 해시(SHA-256 등)가 아닌 느린 해시(bcrypt·Argon2)를 사용해야 합니다.
SHA-256 활용 사례#
1. 파일 무결성 검증#
소프트웨어 다운로드 후 파일이 변조되지 않았는지 확인합니다.
# macOS / Linux
shasum -a 256 ubuntu-25.04.iso
# → 9b3d8e2f1a... ubuntu-25.04.iso
# Windows
certutil -hashfile ubuntu-25.04.iso SHA256
# 공식 배포 사이트의 체크섬과 비교
# 일치하면 파일이 변조되지 않음
오픈소스 배포(Ubuntu, Debian, Linux 커널)는 항상 SHA-256 체크섬을 함께 공개합니다.
2. 디지털 서명#
문서나 데이터의 서명 검증에 사용됩니다.
- SSL/TLS 인증서
- JWT(JSON Web Token) 서명(HS256, RS256)
- 블록체인 트랜잭션
- 코드 서명(Apple notarization, Microsoft Authenticode)
3. 블록체인#
비트코인은 SHA-256을 두 번 적용(SHA-256d)해 블록 해시를 계산합니다. 이더리움은 Keccak-256(SHA-3 변형)을 사용합니다. 이 해시값이 작업증명(PoW)의 핵심 메커니즘입니다.
4. 데이터 중복 제거#
같은 파일을 다시 업로드하는 것을 방지합니다. 파일 해시값이 이미 존재하면 저장하지 않고 기존 파일을 참조합니다(예: AWS S3 ETag, Git의 blob 해시).
5. Git 커밋 ID#
Git은 SHA-1로 커밋·트리·블롭을 식별합니다. 2018년부터 SHA-256으로의 전환이 진행 중입니다(git --object-format=sha256).
비밀번호 해시: 절대 SHA-256만 쓰지 마세요#
잘못된 방법#
// ❌ 위험 — SHA-256 단독 사용
const hash = crypto.createHash("sha256").update(password).digest("hex");
이유:
- 빠른 해시는 GPU로 초당 수십억 회 시도 가능
- 같은 비밀번호는 같은 해시 → 레인보우 테이블 공격 가능
- 솔트 없이 저장되면 즉시 크랙 가능
올바른 방법: bcrypt#
import bcrypt from "bcryptjs";
// 해시 (비용 인자 12 = 2^12 라운드)
const hash = await bcrypt.hash(password, 12);
// → "$2b$12$KIXmKr4Xa1.../randomSaltAndHash"
// 검증
const isValid = await bcrypt.compare(password, hash);
bcrypt는 솔트를 자동 포함하고,
비용 인자(cost factor)를 높이면 시간이 기하급수적으로 느려집니다. 2026년 기준 비용 12가 일반 권장값(약 200~400ms 소요).
올바른 방법: Argon2(최신 권장)#
import argon2 from "argon2";
// 해시 (Argon2id가 일반 권장)
const hash = await argon2.hash(password, {
type: argon2.argon2id,
memoryCost: 19456, // 19 MB
timeCost: 2,
parallelism: 1,
});
const isValid = await argon2.verify(hash, password);
Argon2는 2015년 PHC(Password Hashing Competition) 우승작입니다. 메모리·시간·병렬도를 모두 조정 가능해 GPU·ASIC 공격에 강합니다.
실전: 텍스트 해시 생성#
해시 생성기로 텍스트를 SHA-256으로 해시한 결과:
입력: Hello, World!
SHA-256: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986d
SHA-512: 374d794a95cdcfd8b35993185fef9ba368f160d8daf432d08ba9f1ed1e5abe6c
c69291e0fa2fe0006a52570ef18c19def4e617c33ce52ef0a6e5fbe318cb0387
눈사태 효과 확인:
입력: Hello, World. (마침표만 다름)
SHA-256: 9c8bef8e48c47e00f31bb0e3bed4b80c7e96f71a9be7b...
마침표 하나 차이로도 해시가 완전히 달라집니다. 이것이 무결성 검증의 핵심입니다.
JavaScript Web Crypto API#
브라우저에서 표준 API로 해시를 계산할 수 있습니다.
async function sha256(text) {
const data = new TextEncoder().encode(text);
const hash = await crypto.subtle.digest("SHA-256", data);
return Array.from(new Uint8Array(hash))
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
}
await sha256("Hello, World!");
// → "dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986d"
본 사이트의 해시 생성기도 Web Crypto API를 사용해
브라우저 안에서만 처리됩니다(서버로 데이터 전송 없음).
MD5는 왜 사용 금지인가?#
MD5(1991년 RFC 1321)는 다음 이유로 보안 용도 사용이 금지되었습니다.
- 2004년: 충돌 공격 첫 성공
- 2008년: SSL 인증서 위조 시연(Sotirov 등)
- 2012년: Flame 멀웨어가 MD5 충돌로 Windows Update 위조
서로 다른 입력으로 같은 MD5 해시를 만드는 것이 가능합니다(2초 이내). 단순한 파일 체크섬(비보안 목적)에만 레거시 호환성을 위해 사용됩니다.
SHA-1도 동일#
2017년 Google·CWI의 SHAttered 공격으로 SHA-1 충돌이 실증되었습니다. 1만 1천 개 GPU-년의 계산이 필요하지만
이론이 아닌 실제 공격이 가능해진 것입니다. SHA-1도 디지털 서명·인증서 용도로는 사용 금지.
해시 vs 암호화 vs 인코딩#
| 분류 | 가역성 | 키 필요 | 용도 |
|---|---|---|---|
| 해시 | 단방향(불가역) | 없음 | 무결성, 비밀번호 |
| 암호화(대칭) | 양방향 | 필요 | 데이터 보호 (AES) |
| 암호화(비대칭) | 양방향 | 공개키·개인키 쌍 | TLS, 디지털 서명 |
| 인코딩(Base64 등) | 양방향(공개) | 없음 | 데이터 표현 |
비밀번호를 "암호화한다"는 표현은 부정확합니다. 비밀번호는 해시(단방향)되어 저장됩니다.
자주 묻는 질문#
Q. SHA-256과 SHA-512 중 어느 것이 더 안전한가요?
A. 현재 둘 다 안전합니다. SHA-512는 64비트 시스템에서 더 빠르고, SHA-256은 일반적으로 충분합니다. 문서 서명이나 고보안 환경에는 SHA-384/SHA-512 권장.
Q. 비밀번호를 SHA-256으로 해시한 데이터베이스가 안전한가요?
A. 안전하지 않습니다. SHA-256은 빠른 해시여서 GPU로 초당 수십억 회 시도가 가능합니다. 데이터베이스 유출 시 약한 비밀번호는 즉시 크랙됩니다. bcrypt 또는 Argon2로 마이그레이션해야 합니다.
Q. 솔트(Salt)는 무엇인가요?
A. 비밀번호에 추가하는 무작위 값입니다. 같은 비밀번호도 솔트가 다르면 다른 해시가 나오므로 레인보우 테이블 공격을 막습니다. bcrypt·Argon2는 자동 솔트를 포함합니다.
Q. 해시를 두 번 적용하면 더 안전한가요?
A. 약간 느려지긴 하지만 충돌 저항성을 크게 개선하지 않습니다. 비밀번호는 bcrypt·Argon2 같은 전용 알고리즘을 쓰는 것이 정답입니다.
Q. HMAC(Hash-based Message Authentication Code)이란?
A. 해시 함수와 비밀 키를 결합해 메시지 인증과 무결성을 동시에 제공합니다. JWT의 HS256(HMAC-SHA256)이 대표 예시. crypto.createHmac("sha256", key).update(message).digest("hex").
Q. 같은 비밀번호가 다른 시스템에서 다른 해시가 나올 수 있나요?
A. 네. 솔트가 다르거나 알고리즘 파라미터(bcrypt 비용, Argon2 메모리 등)가 다르면 같은 비밀번호도 다른 해시값을 생성합니다.
Q. 블록체인에서 SHA-256이 왜 중요한가요?
A. 비트코인 작업증명(PoW)은 "특정 패턴(앞에 0이 N개)으로 시작하는 해시값을 만드는 nonce 찾기" 게임입니다. SHA-256의 일방향성·예측불가능성이 이 메커니즘의 핵심입니다.
Q. 해시 충돌(Collision)이 일어나면 어떻게 되나요?
A. SHA-256은 충돌 확률이 2^128로 사실상 불가능합니다(우주의 별 수보다 큼). MD5·SHA-1처럼 인위적 충돌이 가능한 알고리즘은 디지털 서명·인증서 용도로 사용 금지.
Q. 한국 정부는 어떤 해시를 권장하나요?
A. 한국인터넷진흥원(KISA)는 KCMVP(암호 모듈 검증 제도)에서 SHA-2(SHA-256 이상), SHA-3, HMAC을 권장합니다. 비밀번호 저장은 bcrypt·Argon2 권장.
해시 생성기 활용#
해시 생성기에 텍스트를 입력하면
SHA-1·SHA-256·SHA-384·SHA-512 해시값을 즉시 생성합니다. 브라우저 내에서만 처리되며 서버로 데이터가 전송되지 않습니다.
비밀번호 보안에 대한 종합 가이드가 필요하다면 안전한 비밀번호 만들기: 비밀번호 보안 완전 가이드를 참고하세요.
면책 안내#
이 글은 일반적인 보안 정보 제공 목적으로 작성되었습니다. 실제 보안 시스템 구축, 비밀번호 정책 설계, 암호 모듈 검증(KCMVP) 적용 시 보안 전문가 상담을 권장합니다. 알고리즘 선택과 파라미터 설정은 위협 모델·성능 요구사항에 따라 달라질 수 있습니다.