한양과학기술고등학교

에듀테크 프로젝트 대시보드

해시 함수와 눈사태 효과

해시 함수(Hash Function)란 어떤 길이의 입력이든 항상 같은 길이의 고정된 출력(지문·다이제스트)으로 바꿔주는 함수입니다. 같은 입력은 항상 같은 출력을 내지만(결정성), 출력만 보고 원래 입력을 역으로 알아낼 수는 없습니다(단방향성). 아래에서 브라우저 내장 SHA-256 알고리즘으로 직접 실험해 보세요.
🧮 실시간 SHA-256 계산기 Web Crypto API
입력 길이 9 바이트
출력 길이 항상 256비트 (64자 hex)
계산 중...
입력을 아무리 길게(혹은 짧게) 바꿔도 출력은 항상 64자리 16진수입니다. 한 글자짜리 "a"도, 소설 한 권도 출력 길이는 동일합니다.
🌊 눈사태 효과(Avalanche Effect) 비트 단위 비교
달라진 비트 수 (256비트 중) —
달라진 비율 —
좋은 해시 함수는 입력이 단 1글자만 바뀌어도 출력 비트의 약 50%가 완전히 무작위로 뒤바뀝니다. 이걸 눈사태 효과라고 부릅니다 — 작은 변화가 눈덩이처럼 커져서 전혀 다른 결과가 되기 때문입니다. 빨간 칸이 달라진 비트입니다.
📐 해시 함수의 핵심 성질 4가지
1
결정성 (Determinism)
같은 입력 → 항상 같은 출력. 위 계산기에 같은 문자열을 여러 번 넣어도 결과는 동일합니다.
2
고정 길이 출력 (Fixed-length)
입력 크기와 무관하게 SHA-256은 항상 256비트를 출력합니다.
3
눈사태 효과 (Avalanche Effect)
입력 1비트 변화가 출력 전체를 무작위로 뒤흔듭니다. 위 데모로 직접 확인해 보세요.
4
역상·충돌 저항성 (Preimage / Collision Resistance)
해시값만 보고 원래 입력을 찾거나, 같은 해시를 내는 다른 입력 쌍을 찾는 것이 사실상 불가능해야 합니다. (관련: 생일 공격)
🐍 코드로 보는 SHA-256
# Python import hashlib h = hashlib.sha256(b"offset0xf") print(h.hexdigest()) # → 64자리 16진수 문자열
// JavaScript (브라우저 Web Crypto API) async function sha256(text) { const data = new TextEncoder().encode(text); const buf = await crypto.subtle.digest("SHA-256", data); return [...new Uint8Array(buf)] .map(b => b.toString(16).padStart(2,'0')).join(''); }
이 페이지의 계산기도 실제로 이 crypto.subtle.digest 함수를 그대로 호출하고 있습니다 — 서버로 아무것도 전송하지 않고 브라우저에서 즉시 계산됩니다.