본문으로 건너뛰기
yutils

SHA 해시는 어떻게 만들어질까?

암호화 해시 함수의 동작 원리를 풀어본다. one-way 의 의미, SHA-2 (Merkle-Damgård) 와 SHA-3 (sponge) 의 차이, MD5/SHA-1 이 깨진 이유, 그리고 왜 빠른 해시가 비밀번호에는 부적합한지.

약 9분 읽기

SHA-256 같은 암호화 해시는 어떤 입력이든 받아 고정 길이 (256 비트 = 64 hex 문자) 의 "지문" 을 뱉는다. 똑같은 입력은 항상 똑같은 지문, 1 비트만 바꿔도 지문은 완전히 달라진다. 이 가이드는 SHA 가 실제로 어떻게 그 지문을 만드는지, 왜 거꾸로 풀 수 없는지, 왜 MD5/SHA-1 은 "깨졌다" 고 부르는지, 그리고 왜 빠른 해시를 비밀번호 저장에 쓰면 안 되는지 정리한다.

해시 함수의 4 가지 약속

  • 결정성 (Deterministic) — 같은 입력 → 같은 출력. 매번. 어떤 시스템에서든.
  • 고정 길이 출력 — 입력이 1 바이트든 1 GB 든 결과 크기는 같음 (SHA-256 = 32 바이트).
  • 일방향 (Pre-image resistance) — 해시 값으로부터 원본 입력을 역산할 수 없다.
  • 충돌 저항 (Collision resistance) — 같은 해시를 내는 서로 다른 두 입력을 찾기 어렵다.

직접 확인 — SHA 해시 에 같은 문자열을 두 번 넣으면 같은 hex, 한 글자 바꾸면 결과가 완전히 달라진다 (avalanche effect).

SHA-2 — Merkle-Damgård 구조

SHA-224 / SHA-256 / SHA-384 / SHA-512 는 모두 Merkle-Damgård 구조 기반. 1979 년 Ralph Merkle 박사 논문 + Ivan Damgård 의 개선:

1. 입력 → 패딩 (마지막 비트 길이 박음)
2. 고정 크기 블록 (512 비트 또는 1024 비트) 으로 자름
3. 초기 hash state (IV — 8 개 32 비트 정수, 고정값)
4. 각 블록마다 compression function 적용:
   state = compress(state, block)
5. 마지막 state 가 곧 hash 값

SHA-256 의 compress() 는 64 라운드로 구성. 각 라운드 에서 비트 회전·XOR·modular addition·AND/OR 같은 단순 연산을 반복한다. 단순하지만 누적되면 입력 1 비트 변화가 출력 평균 128 비트를 뒤집는다 — avalanche effect.

SHA-3 — 완전히 다른 sponge 구조

2007 년 NIST 가 SHA-2 와 다른 설계 원리의 해시를 공모. 2012 년 Keccak 알고리즘 선정. SHA-3 의 핵심은 sponge:

Absorb (흡수):
  state (1600 비트) = 0 으로 초기화
  각 입력 블록을 state 의 일부와 XOR
  permutation 함수 (Keccak-f) 적용
  반복

Squeeze (압착):
  state 의 일부를 출력으로 잘라냄
  더 필요하면 permutation 한 번 더
  반복

Merkle-Damgård 의 length extension attack 약점을 구조적으로 회피. SHA-3 는 sponge 라서 hash(secret || data) 같은 패턴 도 안전 (SHA-2 는 위험 — HMAC 으로 회피).

SHA-2 vs SHA-3 vs SHAKE — 어떤 걸 쓰나

이름출력 비트구조용도
SHA-1160Merkle-Damgård❌ 깨짐 (2017 충돌 사례)
SHA-256256Merkle-Damgård✅ 가장 흔함 (TLS·Git·Bitcoin)
SHA-512512Merkle-Damgård✅ 64-bit CPU 에서 SHA-256 보다 빠를 수도
SHA3-256256Sponge✅ SHA-2 대안, length extension 안전
SHAKE-128/256가변Sponge✅ 임의 길이 출력 (KDF 등)

새 시스템 default 는 SHA-256 권장 — 호환성·라이브러리·하드웨어 가속 가장 풍부. 보안 paranoid 라면 SHA3-256. SHAKE 는 KDF / 가변 길이가 필요한 niche.

MD5 와 SHA-1 은 왜 "깨졌나"

"깨졌다" 의 의미 — 충돌을 의도적으로 만들 수 있다. 같은 해시를 내는 서로 다른 입력 두 개를 공격자가 손에 넣을 수 있다는 뜻.

  • MD5 충돌: 2004 년 Wang 등이 실용적 알고리즘 발표. 현재 노트북에서 수초 만에 충돌 생성. Flame 멀웨어 (2012) 가 MD5 충돌로 Microsoft 인증서 위조.
  • SHA-1 충돌: 2017 년 Google + CWI 의 SHAttered 공격으로 같은 SHA-1 해시를 가지는 PDF 두 개 공개. 9.2 × 10^18 회 SHA-1 계산 — 단일 GPU 6,500 년, 그러나 Google 인프라로는 가능.

암호화·디지털 서명 용도로 MD5 / SHA-1 절대 사용 X. 비암호 용도 (체크섬·캐시 키) 는 OK — 의도적 충돌 위험 없는 곳.

왜 SHA 로 비밀번호 저장하면 안 되나

SHA-256 은 일부러 빠르게 설계됨. 현대 GPU 는 초당 수십억 SHA-256 계산. 공격자가 8 자리 영문+숫자 비밀번호 (~218 trillion 조합) 를 brute-force 하는 데 며칠~몇 시간.

해결책:

  • 의도적으로 느린 해시 — bcrypt / Argon2 / scrypt. cost 파라미터 (work factor) 로 hash 1 회 계산이 100ms 걸리도록 조정. 공격자의 brute-force 가 1 만 배 느려짐.
  • salt — 사용자마다 다른 random 값 추가. rainbow table 무력화.
  • pepper (선택) — DB 가 아닌 별도 환경변수에 박힌 전역 시크릿. DB dump 만으로 충분치 않음.

직접 비교 — SHA 해시 의 SHA-256 은 1KB 입력에 1ms 미만. Bcrypt 해시 의 cost 10 은 같은 입력에 ~100ms (10 만 배 느림). 정확한 비교 는 password-hashing 가이드 참조.

HMAC — 키와 해시를 안전하게 조합

secret key + data → MAC (message authentication code) 가 필요할 때. naive 한 SHA256(secret || data) 는 SHA-2 의 length extension 약점으로 위험. HMAC 은 이 약점 회피 패턴:

HMAC(key, msg) =
  SHA256(
    (key XOR opad) || SHA256((key XOR ipad) || msg)
  )

opad = 0x5c repeated
ipad = 0x36 repeated

SHA 두 번 + XOR 두 번. HMAC 생성기 에서 실험 가능. 검증 짝은 HMAC 검증기.

실용 시나리오

파일 무결성

다운로드 ISO 옆 sha256sums.txt. 받은 파일 SHA-256 결과가 같으면 도중 변조 X.

Git commit ID

Git 은 commit 의 SHA-1 해시를 commit ID 로 사용 (현재 SHA-256 마이그레이션 진행 중). 같은 commit 은 어디서든 같은 ID.

Bitcoin / 블록체인

SHA-256 두 번 해시 (double SHA) 로 블록 헤더 해시 + 채굴 PoW. "이 해시가 N 개의 0 으로 시작하도록 nonce 를 찾아라."

Content-addressable storage

IPFS / Docker 이미지 layer / npm package integrity (sri). 콘텐츠 자체의 해시가 곧 주소.

참고 자료

요약

  • 해시 = 결정적 + 고정 출력 + 일방향 + 충돌 저항 4 약속.
  • SHA-2 는 Merkle-Damgård, SHA-3 는 sponge — 다른 구조라 length extension 같은 약점 차이.
  • MD5 / SHA-1 은 충돌 만들 수 있어 암호 용도 X. 비암호 용도 (체크 섬·캐시 키) 는 무방.
  • 비밀번호 저장은 SHA X — bcrypt / Argon2 등 의도적 느린 해시.
  • MAC 이 필요하면 HMAC. naive concat 은 length extension 위험.
  • 직접 실험 — SHA 해시 / MD5 해시 / HMAC 생성기 / Bcrypt 해시.
가이드 목록으로