해시 생성기
MD5, SHA-1, SHA-256, SHA-512 해시를 생성하는 무료 온라인 도구입니다.
📝 입력 텍스트
✨ 생성된 해시
MD5128-bit
SHA-1160-bit
SHA-256256-bit ⭐ 권장
SHA-512512-bit
해시 함수는 임의의 크기의 데이터를 고정된 크기의 값으로 변환합니다. 비밀번호 저장, 파일 무결성 검증 등에 사용됩니다. SHA-256이 현재 가장 권장되는 알고리즘입니다.
해시 함수란?
해시 함수는 임의의 크기의 데이터를 고정된 크기의 값(해시)으로 변환하는 단방향 함수입니다. 동일한 입력은 항상 동일한 해시를 생성하며, 해시로부터 원본 데이터를 복원할 수 없습니다.
주요 기능
- 4가지 알고리즘: MD5, SHA-1, SHA-256, SHA-512
- 실시간 생성: 입력과 동시에 해시 생성
- 즉시 복사: 각 해시를 클릭 한 번으로 복사
- 다국어 지원: UTF-8 완벽 지원 (한글, 일본어, 중국어 등)
- 추천 알고리즘 표시: SHA-256 권장
지원 알고리즘
MD5 (128-bit) ⚠️
- 길이: 32자 (16진수)
- 속도: 매우 빠름
- 보안: 취약 - 충돌 공격 가능
- 용도: 체크섬, 레거시 시스템
입력: Hello World
MD5: b10a8db164e0754105b7a99be72e3fe5
SHA-1 (160-bit) ⚠️
- 길이: 40자 (16진수)
- 속도: 빠름
- 보안: 취약 - 충돌 공격 가능
- 용도: Git (레거시), 체크섬
입력: Hello World
SHA-1: 0a4d55a8d778e5022fab701977c5d840bbc486d0
SHA-256 (256-bit) ⭐ 권장
- 길이: 64자 (16진수)
- 속도: 중간
- 보안: 강력 - 현재 안전
- 용도: 비밀번호 해싱, 블록체인, 디지털 서명
입력: Hello World
SHA-256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
SHA-512 (512-bit)
- 길이: 128자 (16진수)
- 속도: SHA-256보다 느림 (64비트 시스템에서는 빠를 수 있음)
- 보안: 매우 강력
- 용도: 높은 보안 요구 시
입력: Hello World
SHA-512: 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b
사용 사례
1. 비밀번호 저장 (SHA-256 + Salt)
const password = 'myPassword123';
const salt = generateRandomSalt(); // UUID 등
const hash = sha256(password + salt);
// 데이터베이스에 저장
// { username: 'user1', hash: '...', salt: '...' }
⚠️ 주의: 실제로는 bcrypt, argon2 같은 전용 알고리즘 사용 권장!
2. 파일 무결성 검증
# 다운로드 한 파일의 해시 확인
$ sha256sum ubuntu-22.04.iso
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
# 공식 해시와 비교
3. API 서명
const data = { userId: 123, amount: 100 };
const secret = 'api-secret-key';
const signature = sha256(JSON.stringify(data) + secret);
// 요청 헤더에 포함
// X-Signature: a591a6d40bf420404a011733cfb7b190...
4. Git 커밋 ID
# Git은 SHA-1을 사용 (각 커밋의 고유 ID)
$ git log --oneline
a591a6d Fix bug in login
b10a8db Add new feature
5. 캐시 키 생성
const cacheKey = md5(`user:${userId}:profile`);
cache.set(cacheKey, userData);
6. 데이터 중복 제거
const contentHash = sha256(fileContent);
if (seenHashes.has(contentHash)) {
console.log('중복 파일');
} else {
seenHashes.add(contentHash);
}
해시 충돌
충돌이란?
서로 다른 입력이 동일한 해시를 생성하는 경우:
input1 ≠ input2
hash(input1) = hash(input2) ← 충돌!
알고리즘별 충돌 저항성
| 알고리즘 | 충돌 저항성 | 상태 |
|---|---|---|
| MD5 | ❌ 매우 약함 | 2004년부터 충돌 발견 |
| SHA-1 | ❌ 약함 | 2017년 실제 충돌 공개 |
| SHA-256 | ✅ 강함 | 현재까지 안전 |
| SHA-512 | ✅ 매우 강함 | 현재까지 안전 |
충돌 확률
SHA-256의 경우:
- 가능한 해시 수: 2^256 ≈ 1.16 × 10^77
- 생일 역설로 50% 충돌 확률: 2^128번 시도 필요
- 실용적으로 불가능!
프로그래밍 언어별 사용법
JavaScript (브라우저)
async function sha256(text) {
const encoder = new TextEncoder();
const data = encoder.encode(text);
const hash = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hash));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
const hash = await sha256('Hello World');
JavaScript (Node.js)
const crypto = require('crypto');
const hash = crypto.createHash('sha256')
.update('Hello World')
.digest('hex');
Python
import hashlib
# SHA-256
hash_sha256 = hashlib.sha256('Hello World'.encode()).hexdigest()
# MD5
hash_md5 = hashlib.md5('Hello World'.encode()).hexdigest()
PHP
<?php
// SHA-256
$hash = hash('sha256', 'Hello World');
// MD5
$hash = md5('Hello World');
?>
Java
import java.security.MessageDigest;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest("Hello World".getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
Bash
# SHA-256
echo -n "Hello World" | sha256sum
# MD5
echo -n "Hello World" | md5sum
보안 모범 사례
✅ 올바른 사용
1. 비밀번호 저장 (Salt + Hash)
const bcrypt = require('bcrypt');
// 비밀번호 해싱
const hash = await bcrypt.hash(password, 10);
// 검증
const isValid = await bcrypt.compare(password, hash);
2. API 서명 검증
const expectedSignature = sha256(payload + secret);
if (receivedSignature === expectedSignature) {
// 유효한 요청
}
3. 파일 체크섬
const fileHash = sha256(fileContent);
// 다운로드 후 검증
❌ 잘못된 사용
1. 비밀번호를 단순 해시만 사용
// 잘못됨!
const hash = md5(password);
// 레인보우 테이블 공격에 취약
2. MD5를 보안 목적으로 사용
// 잘못됨!
const signature = md5(data + secret);
// 충돌 공격 가능
3. 해시만으로 인증
// 잘못됨!
if (requestHash === sha256(userId)) {
// 예측 가능
}
실용적인 팁
1. Salt 사용 (비밀번호)
// Salt 추가로 레인보우 테이블 공격 방어
const salt = crypto.randomBytes(16).toString('hex');
const hash = sha256(password + salt);
// 저장: { hash, salt }
2. HMAC 사용 (서명)
// 단순 해시보다 HMAC이 안전
const hmac = crypto.createHmac('sha256', secret)
.update(data)
.digest('hex');
3. 느린 해시 사용 (비밀번호)
// bcrypt, scrypt, argon2는 의도적으로 느림
// 무차별 대입 공격 방어
const hash = await bcrypt.hash(password, 12); // rounds
4. 파일 해시 스트리밍
// 큰 파일은 스트리밍으로 처리
const hash = crypto.createHash('sha256');
const stream = fs.createReadStream('largefile.bin');
stream.on('data', chunk => hash.update(chunk));
stream.on('end', () => {
console.log(hash.digest('hex'));
});
해시 vs 암호화
해시 (Hash)
- 단방향: 복호화 불가능
- 고정 길이: 입력 크기와 무관
- 결정적: 같은 입력 → 같은 출력
- 용도: 무결성 검증, 비밀번호 저장
암호화 (Encryption)
- 양방향: 복호화 가능
- 가변 길이: 입력에 비례
- 비결정적: 매번 다른 출력 가능
- 용도: 데이터 보호, 통신 보안
자주 묻는 질문
Q: MD5를 사용해도 되나요?
보안 목적으로는 절대 안 됩니다. 체크섬이나 비보안 용도로만 사용하세요.
Q: 해시로 비밀번호를 저장해도 되나요?
단순 해시는 안전하지 않습니다. bcrypt, argon2, scrypt 같은 전용 알고리즘을 사용하세요.
Q: SHA-256과 SHA-512 중 어느 것이 좋나요?
- SHA-256: 대부분의 경우 충분, 널리 사용됨
- SHA-512: 더 강력하지만 느릴 수 있음 (64비트 시스템에서는 빠를 수 있음)
일반적으로 SHA-256 권장!
Q: 해시를 해독할 수 있나요?
아니요. 해시는 단방향 함수입니다. 하지만 레인보우 테이블로 약한 비밀번호는 추측 가능합니다.
Q: 같은 해시가 나올 수 있나요?
이론적으로 가능하지만 (비둘기집 원리), SHA-256의 경우 실용적으로 불가능합니다.
Q: 파일 해시는 어떻게 계산하나요?
이 도구는 텍스트만 지원합니다. 파일 해시는 명령줄 도구나 전용 프로그램을 사용하세요.
관련 도구
- Base64 인코더 - Base64 인코딩/디코딩
- UUID 생성기 - 고유 식별자 생성
- 비밀번호 생성기 - 강력한 비밀번호 생성
성능
- 생성 속도: 밀리초 미만 (텍스트 기준)
- 실시간 처리: 입력 즉시 생성
- 메모리 사용: 최소
- 오프라인 작동: 완전 지원
브라우저 호환성
이 도구는 Web Crypto API를 사용합니다:
- Chrome (모든 버전) ✓
- Firefox (모든 버전) ✓
- Safari 11+ ✓
- Edge (모든 버전) ✓
개인정보 보호
이 도구는 완전히 클라이언트 측에서 작동합니다. 입력한 데이터는 서버로 전송되지 않으며, 브라우저에서만 처리됩니다.