개발자 도구7 분 읽기|MJ민재

비밀번호를 MD5로 저장했다가 큰일 날 뻔한 이야기 — 해시 함수 완전 정복

MD5가 왜 2004년에 이미 깨졌는지, 2012년 플레임 악성코드가 어떻게 이걸 무기로 썼는지, SHA-256과 SHA-512 차이, 솔팅이 뭔지까지 — 한 번 읽으면 다시 MD5 쓰고 싶지 않아요.

첫 직장 백엔드 코드에서 이걸 발견했어요. MD5(user.password). 그 코드 작성자는 이미 퇴사한 상태였고, 제가 문제를 제기했더니 돌아온 답이 '어쨌든 해시 처리는 됐잖아요?'였어요. 그날 이후 암호화 해시 함수에 대해 제대로 공부했어요. 아니요, 괜찮지 않아요. 그리고 그 이유가 생각보다 훨씬 흥미롭고 중요한 이야기예요.

이 글에서는 해시 함수가 실제로 어떻게 작동하는지, MD5가 왜 무너졌는지(타임라인 포함), SHA-256과 SHA-512가 뭐가 다른지, 솔팅이 뭔지 다뤄요. 읽고 나면 어떤 상황에서 어떤 알고리즘을 써야 하는지 바로 답할 수 있을 거예요.

이 글에서 알 수 있는 것

  • MD5, SHA-1, SHA-256, SHA-512 알고리즘 비교표 — 출력 크기, 속도, 현재 보안 상태까지
  • MD5가 표준에서 무기로 변한 타임라인 — 2012년 플레임 악성코드 사건 포함
  • 비밀번호 솔팅이 무엇인지, 왜 필요한지, 어떤 알고리즘이 이걸 자동으로 처리하는지

해시 함수가 실제로 하는 일

해시 함수는 어떤 크기의 입력이든 — 문자 하나, 10GB 파일, 소설 전체 — 고정된 길이의 출력으로 변환해요. 출력 크기는 알고리즘마다 달라요. MD5는 항상 128비트(16진수 32자), SHA-256은 항상 256비트(16진수 64자)를 생성해요. 입력 크기와 무관하게요.

  • 결정적: 같은 입력은 항상 같은 해시를 생성해요. 'hello'는 어떤 컴퓨터에서, 어떤 시간에 계산해도 동일한 해시가 나와요.
  • 단방향: 해시값으로 원본 입력을 역산할 수 없어요. 되돌리는 버튼이 없어요.
  • 눈사태 효과: 입력에서 문자 하나만 바꿔도 출력이 완전히 달라져요. 조금 달라지는 게 아니라 완전히 달라져요.
  • 고정 길이 출력: 입력이 얼마나 길든 출력은 항상 같은 크기예요. 1바이트짜리 파일과 1GB짜리 파일의 해시 길이가 같아요.
  • 충돌 저항: 같은 해시를 가진 두 개의 서로 다른 입력을 찾는 것이 계산적으로 불가능해야 해요.
💡

해시와 암호화는 완전히 다른 거예요

해싱은 단방향이에요. 해시를 원본값으로 되돌릴 수 없어요. 암호화는 양방향이에요. 올바른 키가 있으면 원본 데이터를 복호화할 수 있어요. 비밀번호를 해시로 저장하는 게 맞는 이유가 바로 이거예요. 암호화로 저장하면 키를 탈취당했을 때 모든 비밀번호가 노출돼요.

지금 이 도구를 사용해 보세요:

해시 생성기 사용해보기

알고리즘 비교: MD5, SHA-1, SHA-256, SHA-512

알고리즘출력 크기속도보안 상태지금 써도 되나?
MD5128비트 (32자)매우 빠름파괴됨 — 초 단위 충돌 가능아니오 (비보안 용도만)
SHA-1160비트 (40자)빠름폐기 권고 — 실용적 충돌 입증 (2017)아니오 (레거시만)
SHA-256256비트 (64자)보통강력 — 알려진 공격 없음예 (기본 선택)
SHA-512512비트 (128자)64비트에서 빠름강력 — 더 큰 보안 마진예 (고보안용)

MD5 붕괴 타임라인 — 표준이 무기가 되기까지

MD5는 1992년 Ronald Rivest가 설계해서 10년 넘게 지배적인 해시 알고리즘이었어요. 그러다 약 8년에 걸쳐 유비쿼터스 표준에서 실제 공격 도구로 전락했어요.

MD5 보안 붕괴 타임라인

1.1992년: Ronald Rivest가 MD5 설계. 파일 무결성 검사와 비밀번호 저장에 광범위하게 채택됨.
2.1996년: 첫 이론적 약점 확인. 보안 커뮤니티에서 신규 시스템에 SHA-1 권고 시작.
3.2004년: 중국 연구자들(Wang 등)이 일반 PC에서 MD5 충돌을 초 단위로 찾을 수 있음을 입증. 이 알고리즘은 보안 용도로 근본적으로 깨진 거예요.
4.2008년: 연구자들이 MD5 충돌을 이용해 가짜 인증 기관(CA) 인증서를 생성. 처음으로 실제 CA 인프라가 해시 충돌로 손상됨.
5.2010년: 주요 브라우저 벤더들이 SSL/TLS 인증서에서 MD5 폐기 선언.
6.2012년: 플레임(Flame) 악성코드 — 국가 수준의 행위자로 추정됨 — 가 MD5 충돌을 이용해 합법적으로 보이는 Microsoft 코드 서명 인증서를 위조. Windows 업데이트 자체가 무기화됨. MD5는 '폐기 권고'에서 '적극적으로 위험함'으로 이동.
7.2024년: MD5는 여전히 비보안 용도(파일 중복 제거, 캐시 키, ETag)에서 널리 쓰이는데 이건 괜찮아요. 하지만 어떤 보안 용도로도 MD5를 정당화할 수 없어요.
⚠️

MD5는 비밀번호, 인증서, 서명에 절대 안 돼요

충돌이 가능하다는 건 공격자가 합법적인 것과 동일한 MD5 해시를 생성하는 악의적인 입력을 만들 수 있다는 뜻이에요. 비밀번호 저장에서 MD5는 너무 빠르다는 문제도 있어요. GPU 클러스터로 초당 수십억 개의 MD5 해시를 테스트할 수 있어요. 비밀번호 시스템에서 MD5를 발견하면 즉각적인 보안 사고로 처리해야 해요.

SHA-256 vs SHA-512 — 뭘 써야 할까요?

SHA-256과 SHA-512는 모두 SHA-2 계열이에요. 둘 다 안전해요. 차이는 보안보다는 실용적인 측면이에요.

  • SHA-256: 2026년 기본 선택이에요. 모든 곳에서 지원돼요. TLS 인증서, JWT 서명, Git 커밋 해시, 비트코인 채굴. 뭘 써야 할지 모르면 SHA-256을 쓰면 돼요.
  • SHA-512: 64비트 시스템에서 더 빠를 수 있어요. SHA-512는 내부적으로 64비트 연산을 사용해서 64비트 하드웨어에서 SHA-256보다 실제로 빠른 경우가 있어요. 더 큰 보안 마진이 필요하거나 64비트 연산의 혜택을 받을 때 써요.
  • SHA-3: 완전히 다른 설계예요. SHA-2가 깨지는 경우를 대비한 백업으로 설계됐어요. 2026년 신규 프로젝트에서 필수는 아니지만, 알고리즘 다양성이 필요한 고보안 시스템에 유용해요.

비밀번호 해싱 — SHA-256도 틀린 이유

많은 개발자를 놀라게 하는 사실이 있어요. SHA-256은 안전하지만 비밀번호 저장에는 잘못된 선택이에요. 문제는 속도예요. SHA-256은 빠르게 설계됐어요. 파일 무결성 검사에는 이상적이지만 비밀번호에는 최악이에요. 공격자가 초당 수십억 개의 SHA-256 해시를 테스트할 수 있거든요.

비밀번호에는 의도적으로 느린 알고리즘이 필요해요. bcrypt, scrypt, Argon2가 그것들이에요. 계산 비용이 크도록 설계됐는데, 얼마나 느릴지를 조절할 수 있어요. 로그인 체감 속도와 보안을 맞바꾸는 거예요.

  • bcrypt: 클래식 선택이에요. 광범위하게 지원돼요. 72자 입력 제한이 있어요(더 긴 비밀번호는 잘려요). 이게 알려진 한계예요. 작업 인수를 조절할 수 있어요.
  • scrypt: 메모리 하드니스가 추가됐어요. CPU만이 아니라 대용량 RAM도 필요해요. GPU 클러스터 공격에 더 강해요.
  • Argon2: 2015년 비밀번호 해싱 경쟁 우승자예요. 현재 최선의 선택이에요. CPU 시간, 메모리, 병렬성을 조절할 수 있어요. 신규 시스템에서는 Argon2id(하이브리드 변형)를 써요.

솔팅이 하는 일 — 레인보우 테이블을 쓸모없게 만드는 것

레인보우 테이블은 일반적인 비밀번호와 그 해시를 미리 계산해놓은 조회 테이블이에요. 솔팅 없이는 데이터베이스를 탈취한 공격자가 'abc123' → MD5 해시를 조회해서 어떤 사용자가 그 비밀번호를 쓰는지 즉시 알 수 있어요. 솔팅은 해싱 전에 각 비밀번호에 무작위 데이터를 추가해서 이걸 막아요.

솔팅 작동 방식

1.사용자가 가입할 때 무작위 솔트를 생성해요: 예) 'x7k2p9'
2.솔트와 비밀번호를 연결해요: 'x7k2p9' + 'password123'
3.결합된 문자열을 해시해요: SHA-256('x7k2p9password123') → 고유한 해시
4.솔트와 해시 모두 데이터베이스에 저장해요 (솔트는 비밀이 아니에요)
5.사용자가 로그인할 때: 그들의 솔트를 가져와서 입력한 비밀번호와 연결하고, 해시하고, 비교해요
6.결과: 두 사용자가 같은 비밀번호를 쓰더라도 다른 해시를 가져요. 레인보우 테이블이 쓸모없어져요.

현대 비밀번호 해싱 알고리즘(bcrypt, Argon2)은 솔트를 자동으로 생성하고 저장해요. 출력 문자열 안에 솔트가 포함돼요. 이 라이브러리들을 사용할 때는 솔트를 직접 관리할 필요가 없어요.

실무에서 해시 함수를 쓰는 경우들

  • 파일 무결성 검증: 파일을 다운로드하고 SHA-256 해시를 게시된 체크섬과 비교해요. 일치하면 전송 중에 변조되지 않은 거예요. Linux ISO와 주요 소프트웨어 패키지들이 SHA-256 체크섬을 일상적으로 게시해요.
  • 비밀번호 저장: Argon2id로 해시해서 저장해요(절대 평문 저장 금지). 데이터베이스가 탈취되더라도 공격자가 해시를 역산해서 비밀번호를 얻을 수 없어요.
  • 디지털 서명: 문서를 SHA-256으로 해시하고 개인키로 그 해시를 암호화해서 서명해요. 수신자도 문서를 해시하고, 서명을 복호화해서 비교해요.
  • 콘텐츠 주소 지정: Git, IPFS, 콘텐츠 전송 네트워크 같은 시스템들이 해시를 통해 위치가 아닌 내용으로 콘텐츠를 식별해요. 해시가 같으면 내용이 동일해요.
  • 데이터 중복 제거: 파일의 전체 내용을 비교하지 않고 해시로 중복을 찾아요. SHA-256 해시가 같은 두 파일은 동일한 파일이에요.
  • 메시지 인증(HMAC): 해시와 비밀 키를 결합해서 내용 무결성과 진위 모두를 검증해요. JWT 토큰, API 인증, 웹훅 서명에 사용돼요.

지금 이 도구를 사용해 보세요:

해시 생성하고 비교해보기

자주 묻는 질문

다른 파일이 같은 해시를 가질 수 있나요?

이론적으로는 가능해요. 이걸 충돌이라고 해요. SHA-256의 경우 우연한 충돌 확률은 약 2^128분의 1이에요. 천문학적으로 작은 수예요. MD5의 경우 충돌을 의도적으로 만들 수 있어요. 실용적으로는: SHA-256 해시가 같은 두 파일은 동일한 파일이에요. MD5 해시가 같은 두 파일은 동일할 수도 있지만 누군가가 공격을 만들었을 수도 있어요.

해싱과 암호화는 같은 건가요?

아니에요. 근본적으로 달라요. 해싱은 단방향이에요. 해시에서 원본 데이터를 복원할 수 없어요. 암호화는 양방향이에요. 올바른 키로 원본 데이터를 복호화할 수 있어요. 무언가를 검증할 때(비밀번호, 파일 무결성) 해시를 써요. 원본 데이터를 나중에 복원해야 할 때 암호화를 써요.

2026년 비밀번호에는 어떤 알고리즘을 써야 해요?

신규 시스템에는 Argon2id가 현재 최선의 선택이에요. 2015년 비밀번호 해싱 경쟁 우승자이고 CPU 시간, 메모리, 병렬성을 조절할 수 있어요. bcrypt를 쓰는 기존 시스템은 여전히 안전하니까 급하게 마이그레이션할 필요는 없어요. MD5, SHA-1, 일반 SHA-256은 비밀번호에 절대 쓰지 마세요.

HMAC이 뭐고 언제 써야 해요?

HMAC(해시 기반 메시지 인증 코드)은 해시 함수와 비밀 키를 결합해서 메시지 인증 코드를 만들어요. 메시지가 변조되지 않았다는 것과 발신자가 비밀 키를 알고 있다는 것 둘 다 검증해요. 사용하는 곳: API 인증(요청 서명 검증), JWT 서명(HS256 = SHA-256을 사용한 HMAC), 웹훅 검증(요청이 합법적인 발신자에게서 왔는지 확인).

SHA-512가 SHA-256보다 빠를 수 있다는 게 사실이에요?

맞아요. SHA-512는 내부적으로 64비트 워드를 사용해서 64비트 프로세서에 최적화돼 있어요. 64비트 기계에서 SHA-512가 SHA-256보다 실제로 빠를 수 있어요. 현대 CPU는 64비트 연산을 효율적으로 처리하거든요. 임베디드 기기나 32비트 시스템에서는 SHA-512가 더 느려요.

SHA-256은 양자 컴퓨터에도 안전한가요?

SHA-256은 양자 공격에 대해 128비트 보안을 제공해요. Grover 알고리즘이 효과적인 키 길이를 절반으로 줄이거든요. 대부분의 목적에서 128비트 양자 보안으로 충분해요. SHA-512는 256비트 양자 보안을 제공해요. 수십 년 후 양자 컴퓨터에 대비한 시스템을 설계한다면 SHA-512나 SHA-3가 더 큰 마진을 줘요.

해시 생성기

텍스트를 입력하면 MD5, SHA-1, SHA-256, SHA-512 해시를 즉시 생성해요. 브라우저에서 처리되고 서버로 데이터가 전송되지 않아요.

해시 생성기 열기

이 글에서 다룬 도구 바로 사용하기

MJ

민재

개발자 겸 테크 라이터. 개발 도구와 파일 변환 기술을 깊이 있게 다룹니다.

이 글이 도움이 되셨나요? 새 가이드 알림 받기

스팸 없이, 새 소식만 보내드립니다. 언제든 취소 가능. · 구독 시 개인정보처리방침에 동의합니다.

이런 글도 좋아하실 수 있어요

84+

제공 도구

100+

블로그 글

English & 한국어

지원 언어

이 페이지를 즐겨찾기하세요! 매주 새로운 무료 도구가 추가됩니다.