(CS/컴퓨터공학) 해시 vs 암호학적 해시, 그리고 왜 모두가 SHA-256을 쓰는가

✨ 개요

“해시(hash)”는 임의 길이 입력 → 고정 길이 출력으로 매핑하는 함수입니다.
그중 암호학적 해시(Cryptographic Hash) 는 보안을 위해 더 강력한 성질을 요구합니다. 이 글은 두 개념의 차이와 SHA-256이 표준으로 자리 잡은 이유를 정리했습니다.


1. 한 장 요약


2 해시 vs 암호학적 해시: 무엇이 다른가?

구분 일반 해시(Murmur3, xxHash 등) 암호학적 해시(SHA-256, SHA-3, BLAKE2/3)
목적 속도·균등 분포 보안 성질 + 균등성
역상 내성(Preimage) 요구 X 요구 O: h만으로 x 찾기 매우 어려움
2차 역상 내성(Second Preimage) 요구 X 요구 O: 같은 h를 만드는 x′ 찾기 어려움
충돌 내성(Collision) 낮음/신경 안 씀 요구 O: x≠x′인데 H(x)=H(x′) 찾기 어려움
어발랜치(Avalanche) 있으면 좋음 강하게 요구(1비트 변화 → 출력 절대적 변화)
사용처 해시맵 키, 샤딩, 체크섬 무결성, 전자서명, HMAC, 블록체인, 증명

결론: 보안이 관여하면 반드시 암호학적 해시를 사용해야 합니다.


3 SHA-256 한눈에


4. 어디에 쓰이나? (대표 시나리오)

1) 무결성 검증 - 파일 배포 시 SHA256SUM 제공 → 사용자는 다운로드 후 해시 일치로 위·변조 탐지. 2) 전자서명/PKI - 서명은 보통 메시지를 먼저 해시(SHA-256) 하고 해시값에 서명 → 속도↑, 일관성↑. 3) HMAC-SHA-256 - API 요청 서명, 웹훅 검증 등 메시지 인증(변조 방지 + 키 필요). 4) 블록체인/머클트리/PoW - 블록 해시, 트랜잭션 머클루트, 비트코인 PoW 등 합의·무결성의 근간. 5) 콘텐츠 주소화(CID) - 동일 내용이면 동일 주소(해시) → 중복 제거, 캐싱 최적화.


5. 체크섬 vs 암호학적 해시


6. 비밀번호에는 왜 쓰면 안 되나?


7. 실무 주의사항(함정과 베스트 프랙티스)


8. 빠른 사용 예시

8.1 Kotlin/JVM (HMAC-SHA-256 포함)

import java.security.MessageDigest
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec

fun sha256Hex(bytes: ByteArray): String =
    MessageDigest.getInstance("SHA-256").digest(bytes).joinToString("") { "%02x".format(it) }

fun hmacSha256Hex(key: ByteArray, data: ByteArray): String {
    val mac = Mac.getInstance("HmacSHA256")
    mac.init(SecretKeySpec(key, "HmacSHA256"))
    return mac.doFinal(data).joinToString("") { "%02x".format(it) }
}

9. 선택 가이드



Related Posts