Text Input

Select Hash Algorithms

ℹ️ About Hash Functions

Hash functions are one-way cryptographic functions that convert input data into a fixed-size string of characters. They are commonly used for data integrity verification, password storage, and digital signatures.

MD5: Fast but cryptographically broken. Use only for checksums, not security.
SHA-1: Deprecated for security purposes. Avoid for new applications.
SHA-256: Currently recommended for most cryptographic purposes.
SHA-384/512: Stronger variants, useful for high-security requirements.
⚠️ Security Note: Hash functions are one-way. You cannot "decrypt" or reverse a hash to get the original data. For password storage, use dedicated password hashing algorithms like bcrypt or Argon2.

📖 Hash(해시)란?

🔑 해시 함수의 개념

해시(Hash)는 임의 크기의 데이터를 고정 크기의 고유한 값으로 변환하는 단방향 암호화 기법입니다. 해시 함수는 같은 입력에 대해 항상 같은 출력을 생성하지만, 출력값(해시값)으로부터 원본 데이터를 복원할 수 없습니다. 이러한 특성으로 데이터 무결성 검증, 비밀번호 저장, 디지털 서명 등에 널리 사용됩니다.

해시 예시:
입력: Hello World
MD5: b10a8db164e0754105b7a99be72e3fe5
SHA-256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

💡 해시의 사용 사례

  • 비밀번호 저장: 사용자 비밀번호를 해시로 변환하여 데이터베이스에 저장 (원본 비밀번호 노출 방지)
  • 파일 무결성 검증: 다운로드한 파일의 해시값을 비교하여 변조 여부 확인
  • 디지털 서명: 문서나 소프트웨어의 진위를 검증
  • 블록체인/암호화폐: 거래 기록의 무결성 보장
  • 데이터 중복 제거: 같은 내용의 파일을 해시값으로 식별
  • 캐시 키 생성: URL이나 쿼리를 짧은 키로 변환
  • 체크섬: 데이터 전송 시 오류 검출

🔧 Hash Generator 사용 방법

  1. 텍스트 입력: 해시로 변환할 텍스트나 데이터 입력
  2. 알고리즘 선택: MD5, SHA-1, SHA-256, SHA-384, SHA-512 중 선택
  3. 자동 생성: 입력 즉시 모든 알고리즘의 해시값이 자동으로 생성
  4. 결과 복사: 생성된 해시값을 클릭하여 클립보드에 복사
  5. 비교: 여러 알고리즘의 해시값을 동시에 확인하여 비교

🔐 주요 해시 알고리즘

MD5 (Message Digest 5)
  • 출력 크기: 128비트 (32자 16진수)
  • 속도: 매우 빠름
  • 보안: ❌ 취약 (충돌 공격 가능)
  • 용도: 파일 무결성 검증, 체크섬 (보안 목적 부적합)
  • 예시: 5d41402abc4b2a76b9719d911017c592
SHA-1 (Secure Hash Algorithm 1)
  • 출력 크기: 160비트 (40자 16진수)
  • 속도: 빠름
  • 보안: ⚠️ 더 이상 안전하지 않음 (2017년 충돌 발견)
  • 용도: Git 커밋 해시, 레거시 시스템 (신규 시스템 부적합)
  • 예시: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
SHA-256 (SHA-2 Family)
  • 출력 크기: 256비트 (64자 16진수)
  • 속도: 보통
  • 보안: ✅ 현재 안전함
  • 용도: 비밀번호 해싱, SSL 인증서, 비트코인
  • 예시:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
SHA-384 (SHA-2 Family)
  • 출력 크기: 384비트 (96자 16진수)
  • 속도: 보통
  • 보안: ✅ 매우 안전함
  • 용도: 고보안 애플리케이션, 정부/금융 시스템
SHA-512 (SHA-2 Family)
  • 출력 크기: 512비트 (128자 16진수)
  • 속도: 느림
  • 보안: ✅ 최고 수준
  • 용도: 최고 수준의 보안이 필요한 경우

⚡ 해시의 주요 특징

🔒 단방향성 (One-way):

해시값에서 원본 데이터를 복원할 수 없습니다. 이것이 암호화와 해시의 가장 큰 차이점입니다.

🎯 결정성 (Deterministic):

같은 입력은 항상 같은 해시값을 생성합니다. 입력이 1비트라도 바뀌면 완전히 다른 해시값이 생성됩니다.

📏 고정 길이 (Fixed Size):

입력 크기와 무관하게 항상 같은 길이의 해시값을 생성합니다. (예: SHA-256은 항상 256비트)

⚡ 빠른 계산 (Fast Computation):

입력에 대한 해시값을 빠르게 계산할 수 있습니다. (단, bcrypt 같은 비밀번호 해시는 의도적으로 느림)

🌊 눈사태 효과 (Avalanche Effect):

입력의 작은 변화가 출력에 큰 변화를 일으킵니다. 1비트만 바뀌어도 해시값의 절반 이상이 바뀝니다.

🔍 충돌 저항성 (Collision Resistance):

서로 다른 두 입력이 같은 해시값을 가질 확률이 극히 낮습니다. (좋은 해시 함수의 경우)

🛡️ 비밀번호 해싱 모범 사례

❌ 하지 말아야 할 것:
  • 단순 해시 사용: MD5나 SHA-256만으로 비밀번호 저장 (무차별 대입 공격에 취약)
  • Salt 없이 해싱: 레인보우 테이블 공격에 취약
  • 약한 알고리즘: MD5, SHA-1 사용
✅ 해야 할 것:
  • 전용 알고리즘 사용: bcrypt, scrypt, Argon2, PBKDF2 사용
  • Salt 추가: 각 비밀번호마다 고유한 무작위 Salt 사용
  • 반복 횟수 증가: 해시 계산을 의도적으로 느리게 만들어 무차별 대입 공격 방지
  • Pepper 고려: 서버 측 비밀 키를 추가로 사용
올바른 비밀번호 저장 예시:
원본: myPassword123
Salt: a8f5f167f44f4964e6c998dee827110c
bcrypt: $2b$10$a8f5f167f44f4964e6c998dee827110c.lzvKXkqhJh2mHQ5vWxK

🔍 해시 충돌이란?

해시 충돌(Collision)은 서로 다른 두 입력이 같은 해시값을 생성하는 경우를 말합니다. 이론적으로 무한한 입력을 유한한 출력으로 매핑하므로 충돌은 불가피하지만, 좋은 해시 함수는 충돌을 찾기 극히 어렵게 만듭니다.

생일 공격 (Birthday Attack):

23명만 모여도 생일이 같은 사람이 있을 확률이 50%를 넘듯이, 해시에서도 √N개의 해시값만 있어도 충돌 확률이 50%를 넘습니다. 이것이 256비트 해시도 2^128번의 시도만으로 충돌을 찾을 수 있는 이유입니다.

  • MD5: ❌ 충돌 쉽게 발견됨 (2004년)
  • SHA-1: ❌ 실제 충돌 생성됨 (2017년, Google)
  • SHA-256: ✅ 현재까지 충돌 미발견
  • SHA-512: ✅ 현재까지 충돌 미발견

💻 프로그래밍 언어별 예시

JavaScript (Node.js):
const crypto = require('crypto');

// SHA-256 해시 생성
const hash = crypto.createHash('sha256')
  .update('Hello World')
  .digest('hex');
console.log(hash);
// a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
Python:
import hashlib

# SHA-256 해시 생성
text = "Hello World"
hash_object = hashlib.sha256(text.encode())
hash_hex = hash_object.hexdigest()
print(hash_hex)
# a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
Java:
import java.security.MessageDigest;

// SHA-256 해시 생성
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest("Hello World".getBytes());
String hashHex = bytesToHex(hash);
System.out.println(hashHex);

❓ 자주 묻는 질문 (FAQ)

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

A: 해시는 단방향으로 원본 복원이 불가능하지만, 암호화는 양방향으로 키를 사용하여 복호화할 수 있습니다. 해시는 데이터 무결성 검증과 비밀번호 저장에, 암호화는 민감한 데이터의 안전한 전송과 저장에 사용됩니다.

Q: MD5는 왜 더 이상 안전하지 않나요?

A: MD5는 2004년에 충돌 공격이 발견되어 보안 용도로는 부적합합니다. 공격자가 의도적으로 같은 해시값을 가진 악성 파일을 만들 수 있습니다. 파일 무결성 검증용으로는 여전히 사용되지만, 비밀번호나 디지털 서명에는 절대 사용하면 안 됩니다.

Q: 어떤 해시 알고리즘을 사용해야 하나요?

A: 일반적인 용도에는 SHA-256을 권장합니다. 비밀번호 저장에는 bcrypt, scrypt, Argon2 같은 전용 알고리즘을 사용하세요. 최고 수준의 보안이 필요하면 SHA-512나 SHA-3를 고려하세요.

Q: 해시값으로 원본을 알아낼 수 있나요?

A: 직접 복원은 불가능하지만, 무차별 대입(Brute Force)이나 레인보우 테이블(Rainbow Table) 공격으로 추측할 수 있습니다. 이것이 비밀번호 해싱 시 Salt와 반복 횟수가 중요한 이유입니다.

Q: Salt란 무엇인가요?

A: Salt는 비밀번호에 추가하는 무작위 문자열입니다. 같은 비밀번호라도 Salt가 다르면 다른 해시값이 생성되어 레인보우 테이블 공격을 방지합니다. 각 사용자마다 고유한 Salt를 사용해야 합니다.

💡 해시 사용 팁

  • 파일 검증: 다운로드한 파일의 공식 해시값과 비교하여 위변조 확인
  • Git 커밋: Git은 SHA-1을 사용하지만 커밋 내용 변조 감지에는 충분
  • API 키 검증: API 요청의 무결성 확인을 위해 HMAC-SHA256 사용
  • 캐시 키: 긴 URL이나 쿼리를 짧은 해시값으로 변환하여 캐시 키로 사용
  • 중복 제거: 대용량 파일 시스템에서 같은 내용의 파일을 해시로 식별
  • 블록체인: 거래 데이터의 무결성 보장을 위해 SHA-256 사용

⚠️ 주의사항

  • MD5와 SHA-1은 보안 용도로 사용하지 마세요 (파일 체크섬 용도만 가능)
  • 비밀번호는 절대 단순 해시로 저장하지 마세요 (bcrypt, Argon2 등 사용)
  • 해시는 암호화가 아닙니다. 원본 데이터를 보호하지 않습니다
  • Salt 없이 비밀번호를 해싱하면 레인보우 테이블 공격에 취약합니다
  • 해시 충돌 가능성을 항상 염두에 두세요 (특히 MD5, SHA-1)