본문으로 건너뛰기
Toova
모든 도구

MD5 대 SHA-256 — 왜 MD5 사용을 중단해야 합니까

Toova

MD5는 어디에나 있습니다. 모든 프로그래밍 언어, 모든 데이터베이스, 모든 클라우드 제공자의 SDK에 포함됩니다. 개발자는 습관으로 손을 뻗습니다 — 빠르고, 깔끔한 32자 16진수 문자열을 생성하며, API는 두 줄의 코드입니다. 문제: MD5는 2004년부터 암호학적으로 깨졌으며, 그 이후로 공격은 더 빠르고 저렴해지기만 했습니다.

이것은 이론적이지 않습니다. 2012년 이란 인프라에 대한 사이버 공격 — Flame 악성 코드 — 은 MD5 충돌을 악용하여 Microsoft 코드 서명 인증서를 위조했습니다. 학술 암호학자들이 논문에서 시연한 동일한 기술이 지정학적 스파이 활동에 사용되는 무기가 되었습니다. MD5는 약간 약화된 것이 아닙니다; 적이 입력을 선택할 수 있는 모든 애플리케이션에 대해 근본적으로 손상되었습니다.

NIST에 의해 표준화된 SHA-2 패밀리의 일부인 SHA-256은 알려진 충돌 공격이 없으며 2026년 암호학적 무결성을 위한 표준으로 남아 있습니다. 이 문서는 그 차이가 정확히 무엇을 의미하는지, MD5가 (드물게) 여전히 허용될 때, 그리고 안전하게 마이그레이션하는 방법을 설명합니다. Toova MD5 해시Toova SHA-256 해시 도구로 두 해시를 즉시 계산할 수 있습니다.

해시 함수가 작동하는 방법

암호학적 해시 함수는 임의 길이의 입력을 받아 다음과 같은 속성을 가진 고정 길이 출력(다이제스트)을 생성합니다:

  • 결정적: 동일한 입력은 항상 동일한 출력을 생성합니다.
  • 눈사태 효과: 입력에서 단일 비트 변경이 출력을 완전히 변경합니다.
  • 사전 이미지 저항: 해시가 주어지면 입력을 찾는 것이 계산적으로 실행 불가능합니다.
  • 충돌 저항: 동일한 해시를 생성하는 두 개의 다른 입력을 찾는 것이 계산적으로 실행 불가능합니다.

눈사태 효과는 MD5와 SHA-256이 한눈에 비슷해 보이는 이유입니다:

MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6

MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b
SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be

입력에서 한 문자가 변경되었지만("dog" → "cog") 출력은 완전히 다릅니다. 이 속성은 두 알고리즘 모두에 적용됩니다. 차이는 공격자가 의도적으로 충돌을 찾으려고 할 때 발생합니다.

MD5 — 실패의 타임라인 (1996–2025)

MD5는 MD4의 대체로 Ron Rivest에 의해 1991년에 설계되었습니다. 1996년까지 Hans Dobbertin은 MD5의 압축 함수에서 충돌을 발견했습니다 — 전체 알고리즘은 아니지만 설계가 취약하다는 경고 신호. 보안 커뮤니티는 SHA-1로의 마이그레이션을 권장하기 시작했습니다. 대부분의 시스템은 이를 무시했습니다.

2004 — 전체 충돌 시연

2004년 8월 Xiaoyun Wang과 Hongbo Yu는 CRYPTO 컨퍼런스에서 MD5에 대한 실용적인 충돌 공격을 발표했습니다. 그들은 클러스터에서 한 시간 미만으로 동일한 MD5 해시를 가진 두 개의 다른 1,024비트 메시지를 생성할 수 있었습니다. MD5의 근본적인 보장 — 충돌 저항 — 이 깨졌습니다.

NIST는 즉시 연방 사용을 위해 MD5를 폐기하기 시작했습니다. 대부분의 업계 지침이 따랐습니다. 프로덕션 시스템에서 MD5의 실제 배포는 거의 변하지 않았습니다.

2008 — 악성 CA 인증서

연구자 그룹(Sotirov, Stevens 등)은 모든 주요 브라우저에서 신뢰될 수 있는 악성 인증 기관 인증서를 만들 수 있음을 시연했습니다. 공격은 여러 인증 기관이 여전히 MD5로 인증서에 서명하고 있다는 사실을 악용했습니다. 연구자들은 합법적으로 보이는 인증서 요청과 자체 제작된 CA 인증서 사이의 충돌을 생성한 다음 — 실제 CA가 합법적인 것에 서명하도록 하여 위조된 CA 인증서에도 유효한 서명을 생성했습니다.

모든 주요 브라우저는 MD5로 서명된 인증서를 즉시 차단했습니다. 대부분의 인증 기관은 발급을 중단했습니다. 하나의 주요 교훈: 공격자가 해시 함수의 입력을 제어하는 순간 암호학적 약점이 악용 가능해집니다.

2012 — Flame 악성 코드

2012년 발견되고 국가 행위자에 기인하는 Flame 사이버 스파이 활동 악성 코드는 선택된 접두사 MD5 충돌을 사용하여 Microsoft Windows Update 인증서를 위조했습니다. 공격은 2008년 시연보다 더 정교했습니다: 공격자는 Microsoft의 서명 인프라가 자신도 모르게 협력할 조건에서 합법적인 Microsoft 인증서와 충돌하는 악의적인 페이로드를 만들 수 있었습니다.

결과: Flame은 유효한 Microsoft 서명과 함께 합법적인 Microsoft 업데이트인 것처럼 Windows Update를 통해 자신을 배포할 수 있었습니다. 이란, 레바논, 시리아 및 수단의 수십만 대의 Windows 머신이 감염되었습니다. 이것은 국가 차원에서 MD5 충돌 공격의 실제 악용이었습니다. 전체 역사는 Flame 악성 코드에 대한 Wikipedia 문서를 참조하세요.

2019–2025 — HashClash와 즉시 충돌

HashClash 프로젝트(Marc Stevens, CWI Amsterdam)는 MD5 충돌 생성을 실용적인 한계로 계속 밀어붙였습니다. 2019년까지 공격자가 두 개의 충돌하는 메시지 모두에 대해 임의의 접두사를 선택할 수 있는 선택된 접두사 MD5 충돌이 상용 하드웨어에서 며칠 안에 생성될 수 있었습니다. 2022년까지 최적화된 구현은 이를 시간으로 줄였습니다. 2024년 HashClash 논문은 단일 현대 GPU에서 1분 미만의 충돌을 시연했습니다.

궤도는 명확합니다: 하드웨어가 개선됨에 따라 MD5 충돌 공격이 더 어려워지지 않고 — 더 쉬워지고 있습니다. 2004년에 클러스터가 걸린 것이 2026년에는 노트북에 걸립니다.

SHA-256 — 왜 견디는가

SHA-256은 NSA에 의해 설계되고 NIST에 의해 2001년에 표준화된 SHA-2 패밀리의 일부입니다. 256비트(32바이트) 다이제스트를 생성합니다. 2026년 현재 SHA-256에 대한 실용적인 충돌 공격은 알려져 있지 않습니다. 가장 잘 공개된 공격은 충돌을 찾기 위한 이론적 작업 계수를 약 2^187 연산으로 줄입니다 — 여전히 존재하거나 예측 가능한 어떤 계산 자원도 훨씬 넘어섭니다.

SHA-256의 보안 여유는 의도적으로 보수적입니다. 하드웨어가 10억 배 향상되더라도(무어의 법칙 관점에서 약 30회 두 배), SHA-256을 깨는 것은 계산적으로 실행 불가능한 채로 남아 있습니다. 충돌에 대한 MD5의 2^18에서 2^23 유효 작업 계수는 2004년 적당한 하드웨어의 범위 내에 있었습니다.

SHA-256은 또한 생각보다 빠릅니다: 현대 CPU에는 코어당 초당 수백만 개의 SHA-256 해시를 계산할 수 있는 전용 SHA 명령어(Intel SHA 확장, ARM 암호화 확장)가 포함되어 있습니다. 일반적인 사용 사례에서 MD5보다 의미 있게 느리지 않습니다.

MD5가 여전히 허용될 때(드물게)

"깨졌다"는 것은 "모든 목적에 무용지물"을 의미하지 않습니다. MD5는 다음과 같은 컨텍스트에서 여전히 허용됩니다:

  • 적이 없을 때: 신뢰할 수 있는 내부 시스템에서 우발적인 파일 손상 감지 — 인터넷에서의 다운로드를 검증하는 것이 아니라 파일 복사가 성공적으로 완료되었는지 확인.
  • 속도가 보안보다 더 중요할 때: 충돌이 단순히 캐시 미스를 의미하고 보안 침해가 아닌 캐시 키나 샤드 식별자 계산. 공격자 모델이 없습니다.
  • 기존 외부 시스템과 일치할 때: 일부 레거시 API는 여전히 MD5 ETag나 체크섬을 보냅니다. 보안 결정에 사용하지 않는 한 상호 운용성을 위해 MD5를 받고 계산할 수 있습니다.
  • 해시 테이블 분할: 키의 MD5로 버킷에 데이터 분산. 여기서 충돌은 보안 실패가 아닌 불균형을 일으킵니다.

공통 주제: MD5는 애플리케이션이 충돌 저항에 의존하지 않고 입력을 만들 수 있는 적이 없을 때 허용됩니다. 어느 조건이든 깨지면 — 공격자 존재 또는 충돌 = 보안 실패 — SHA-256으로 전환하세요.

MD5에 대한 일반적인 신화

"솔트를 추가하면 MD5가 괜찮습니다"

솔팅은 동일한 비밀번호를 가진 두 사용자가 다른 해시를 얻도록 입력을 변경합니다 — 레인보우 테이블 공격을 방지합니다. 그러나 충돌 문제를 해결하지는 않습니다. 솔트가 있는 MD5 해시를 가진 공격자는 MD5가 빠르기 때문에 여전히 효율적으로 무차별 대입할 수 있습니다: 현대 GPU는 초당 약 100억에서 300억 개의 MD5 해시를 계산합니다. 솔트는 알고리즘의 어려움이 아닌 검색 공간에 비례하는 작업을 추가합니다.

비밀번호 해싱의 경우 솔팅에 관계없이 MD5도 SHA-256도 적절하지 않습니다. bcrypt, scrypt 또는 Argon2를 사용하세요.

"내부적으로만 사용하기 때문에 MD5가 괜찮습니다"

내부 시스템은 침해됩니다. "공격자가 우리 입력에 접근할 수 없다"는 위협 모델은 공급망 공격, 내부 위협 또는 잘못된 구성이 시스템을 노출할 때까지 유지되는 경향이 있습니다. Flame 공격은 아마도 내부 통제에 유사한 자신감을 가진 시스템에 대해 발생했습니다.

"SHA-256은 과도하다 — MD5가 더 빠르다"

SHA 가속 명령어가 있는 현대 하드웨어에서 SHA-256은 MD5보다 약 2-5배 느립니다. 대부분의 애플리케이션 — 파일 무결성 검사, API 서명, 캐시 키 — 의 경우 차이는 연산당 마이크로초로 실제로 눈에 띄지 않습니다. SHA-256보다 MD5의 성능 주장은 마이크로초도 중요한 극히 처리량이 높은 시나리오에서만 성립하며, 그조차도 깨진 알고리즘을 사용하는 것보다 더 나은 솔루션이 일반적으로 있습니다.

마이그레이션 가이드 — MD5에서 SHA-256으로

비밀번호 해싱

// 잘못됨: 비밀번호 해싱을 위한 MD5
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// 현대 GPU로 크래킹 시간: 초에서 분 단위
// 잘못됨: 비밀번호 해싱을 위한 SHA-256 (여전히 너무 빠름)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');

// 올바름: 비밀번호에는 bcrypt, scrypt 또는 Argon2 사용
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);

저장된 비밀번호 해시를 마이그레이션하려면 점진적인 접근 방식이 필요합니다. 각 성공적인 로그인 시: 비밀번호를 기존 MD5 해시에 대해 검증한 다음 즉시 bcrypt로 다시 해시하고 저장된 값을 대체하세요. 각 계정을 마이그레이션된 것으로 플래그하세요. 합리적인 기간(90일이 일반적임)이 지난 후 여전히 MD5 해시를 사용하는 나머지 계정에 대해 비밀번호 재설정을 강제하세요.

파일 무결성 / 체크섬

# Linux: 파일 다운로드 검증
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256

# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso

# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256

파일 무결성 검사를 MD5에서 SHA-256으로 전환하는 것은 일반적으로 코드에서 간단한 찾기 및 바꾸기입니다. 두 가지 함정: (1) 데이터베이스나 파일에 저장된 기존 체크섬은 다시 계산되고 업데이트되어야 합니다 — 지름길이 없습니다; (2) MD5 ETag를 제공하는 외부 API나 저장 시스템(일부 S3 설정 같은)은 전환을 조정해야 합니다.

API 인증을 위한 HMAC

// 메시지 인증을 위한 HMAC-SHA-256
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
  .update(message)
  .digest('hex');

API 요청 서명에 HMAC-MD5를 사용한다면 HMAC-SHA-256으로 전환하세요. HMAC 구조는 일부 MD5 공격을 제한하는 비밀 키를 추가하지만, HMAC-MD5는 길이 확장 취약점이 있고 기본 원시는 여전히 손상되었습니다. 현대 표준(JWT, AWS SigV4, OAuth 2.0)은 모두 HMAC-SHA-256을 지정합니다. Toova의 HMAC 생성기는 테스트를 위해 HMAC-SHA-256과 HMAC-SHA-512를 모두 지원합니다.

디지털 서명과 인증서

MD5로 서명된 모든 인증서는 즉시 재발급되어야 합니다 — 대부분의 인증 기관은 2008년 이후 MD5로 서명된 인증서 발급을 중단했으며, 모든 주요 브라우저와 운영 체제가 그것들을 거부합니다. 내부 PKI의 경우 CA 설정을 감사하고 SHA-256이 최소 허용 서명 알고리즘인지 확인하세요. RSA-SHA256 또는 ECDSA-SHA256은 현재 표준입니다.

MD5 대 SHA-256 — 빠른 참조

속성 MD5 SHA-256
출력 길이 128비트 (32 16진수 문자) 256비트 (64 16진수 문자)
충돌 저항 깨짐 (실용적인 공격) 안전 (알려진 공격 없음)
비밀번호 해싱 절대 안 됨 아니오 (bcrypt/Argon2 사용)
디지털 서명 절대 안 됨
파일 무결성 (보안) 절대 안 됨
비보안 체크섬 허용 (공격자 없음) 항상 괜찮음
캐시 키 허용 항상 괜찮음
TLS 인증서 서명 브라우저에 의해 거부됨 표준
FIPS 140-3 준수 아니오 (폐기됨)

결론

MD5는 2004년부터 암호학적으로 깨졌습니다. 선택된 접두사 충돌 — Flame 악성 코드를 가능하게 한 기술 — 은 이제 계산적으로 저렴합니다. 보안을 위해 MD5에 의존하는 모든 애플리케이션(서명, 무결성 검증, 인증)은 실행하는 데 몇 분의 컴퓨팅 시간이 드는 공격에 취약합니다.

SHA-256은 알려진 실용적인 공격이 없고, 현대 CPU에서 하드웨어 가속되며, TLS, 코드 서명 및 API 인증 전반에 걸쳐 암호학적 무결성을 위한 표준입니다. MD5와 비교한 성능 비용은 거의 모든 사용 사례에서 무시할 만합니다.

마이그레이션 경로는 간단합니다: 파일 무결성 검사는 찾기 및 바꾸기입니다. API 서명에는 버전 변경을 조정해야 합니다. 비밀번호 해시는 로그인 시 점진적인 재해싱 전략이 필요합니다. 새 코드의 경우 SHA-256이 기본 선택이 되어야 합니다. Toova MD5Toova SHA-256으로 해시를 직접 계산하고 비교하거나 — HMAC 생성기로 HMAC-SHA-256 인증 코드를 생성하세요.