2097 字
10 分钟
MD5 해시 완벽 가이드: 원리부터 활용까지

MD5란 무엇인가#

MD5는 Message Digest Algorithm 5의 약자로, 1991년 로널드 리베스트가 개발한 암호학적 해시 함수입니다. 임의 길이의 데이터를 입력받아 항상 128비트, 즉 32자리 16진수 문자열을 출력합니다.

쉽게 말해, 아무리 긴 문서나 파일이라도 MD5를 통과시키면 32자짜리 짧은 문자열 하나로 요약된다는 뜻입니다. 이 문자열을 해시값 또는 다이제스트라고 부릅니다.

예를 들어 hello라는 단어의 MD5 해시는 5d41402abc4b2a76b9719d911017c592입니다. hellp처럼 한 글자만 바꿔도 완전히 다른 값이 나옵니다.

MD5의 핵심 특징#

첫째, 단방향성#

MD5는 한쪽 방향으로만 계산됩니다. 원본 데이터에서 해시값을 구하는 것은 쉽지만, 해시값에서 원본을 되돌리는 것은 사실상 불가능합니다.

둘째, 고정 길이 출력#

입력이 한 글자든, 10기가바이트 파일이든 출력은 항상 32자리 16진수입니다. 그래서 큰 파일의 무결성을 확인할 때 편리합니다.

셋째, 결정성#

같은 입력에 대해서는 언제나 같은 해시가 나옵니다. 이 덕분에 파일이 원본과 같은지 비교하거나, 중복 파일을 찾는 데 활용할 수 있습니다.

넷째, 눈사태 효과#

입력이 아주 조금만 달라져도 출력은 완전히 달라집니다. 이 성질은 해시 함수가 입력 변화에 민감하게 반응하도록 설계되었음을 보여줍니다.

MD5는 왜 안전하지 않은가#

MD5는 원래 충돌 저항성을 목표로 설계되었습니다. 충돌이란 서로 다른 두 입력이 같은 해시값을 갖는 상황을 말합니다.

그런데 2004년, 중국의 왕샤오윈 연구팀이 MD5에서 실제 충돌 쌍을 찾아내는 데 성공했습니다. 이후 컴퓨터 성능이 크게 향상되면서 일반 PC로도 몇 초 만에 충돌을 만들어낼 수 있게 되었습니다.

또한 MD5는 솔트 없이 사용될 경우 레인보우 테이블 공격에 취약합니다. 레인보우 테이블이란 미리 계산해 둔 해시와 원본의 대응표입니다.

이런 이유로 보안이 중요한 곳에서는 MD5를 절대 사용해서는 안 됩니다. 비밀번호 저장, 전자 서명, 인증서 등에는 SHA-256 이상의 알고리즘이나 bcrypt, Argon2 같은 느린 해시 함수를 사용해야 합니다.

그런데도 MD5가 쓰이는 이유#

MD5가 보안적으로 취약하다고 해서 완전히 쓸모없는 것은 아닙니다. 보안이 목적이 아닌 영역에서는 여전히 널리 사용됩니다.

대표적인 용도는 다음과 같습니다.

  • 파일 무결성 검사. 다운로드한 파일이 원본과 같은지 확인할 때
  • 캐시 키 생성. 같은 요청인지 빠르게 구분할 때
  • 중복 파일 탐지. 같은 내용의 파일을 찾아낼 때
  • 데이터베이스 인덱스 보조. 긴 문자열을 짧게 요약할 때
  • 비암호학적 식별자 생성. 고유 ID가 필요할 때

중요한 것은 이것들을 모두 보안이 목적이 아닌 곳에서만 쓴다는 점입니다.

파일 무결성 검사에 활용하기#

소프트웨어를 다운로드할 때 배포자가 MD5 값을 함께 제공하는 경우가 많습니다. 사용자는 다운로드한 파일의 MD5를 계산해서 배포자가 알려준 값과 비교하면 됩니다.

값이 일치하면 파일이 전송 과정에서 손상되지 않았고 변조되지 않았다고 볼 수 있습니다. 값이 다르면 파일이 깨졌거나 누군가 중간에서 바꿨을 가능성이 있습니다.

다만 공격자가 파일과 해시를 동시에 조작할 수 있는 상황에서는 이 검사도 무력화됩니다.

비밀번호 저장에 MD5를 쓰면 안 되는 이유#

많은 초보 개발자가 비밀번호를 MD5로 해시해서 저장합니다. 이는 매우 위험한 습관입니다.

이유는 세 가지입니다.

첫째, MD5는 너무 빠릅니다. 초당 수십억 개의 해시를 계산할 수 있어서 무차별 대입 공격에 그대로 노출됩니다.

둘째, 솔트가 없으면 같은 비밀번호는 항상 같은 해시를 갖습니다. 따라서 레인보우 테이블로 쉽게 역추적됩니다.

셋째, 충돌 공격이 가능합니다. 서로 다른 비밀번호가 같은 해시를 가질 수 있습니다.

올바른 방법은 bcrypt, Argon2, PBKDF2 같은 느린 해시 함수를 사용하는 것입니다.

솔트란 무엇인가#

솔트는 해시를 계산하기 전에 입력에 덧붙이는 임의의 문자열입니다. 같은 비밀번호라도 솔트가 다르면 완전히 다른 해시가 생성됩니다.

솔트를 사용하면 레인보우 테이블 공격을 막을 수 있습니다. 공격자가 미리 계산해 둔 표가 있어도, 솔트가 매번 다르면 그 표는 쓸모가 없어지기 때문입니다.

다만 솔트를 MD5에 추가해도 보안이 완전히 해결되지는 않습니다. MD5 자체가 너무 빠르기 때문입니다.

HMAC과 MD5#

HMAC은 해시 함수를 이용해 메시지 인증 코드를 만드는 방식입니다. MD5 기반 HMAC도 존재하지만, 현재는 SHA-256 기반 HMAC을 권장합니다.

HMAC은 메시지가 변조되지 않았는지 확인하는 데 쓰입니다. 비밀 키를 가진 쪽만 올바른 서명을 만들 수 있기 때문입니다.

MD5와 SHA-256 비교#

출력 크기는 MD5가 128비트, SHA-256이 256비트입니다. 개발 연도는 MD5가 1991년, SHA-256이 2001년입니다. 충돌 저항성은 MD5가 이미 깨졌고 SHA-256은 현재까지 안전합니다. 속도는 MD5가 더 빠르고, SHA-256이 상대적으로 느립니다.

실무에서의 권장 사항#

새 프로젝트에서는 MD5를 보안 목적으로 사용하지 마세요.

무결성 검사에는 SHA-256 이상을 사용하세요.

비밀번호 저장에는 bcrypt나 Argon2를 사용하세요.

기존 시스템에서 MD5를 사용 중이라면 마이그레이션 계획을 세우세요.

MD5를 꼭 써야 한다면 비보안 용도로만 한정하세요.

기존 시스템 마이그레이션 전략#

이미 MD5로 저장된 데이터를 안전한 알고리즘으로 옮기는 방법은 다음과 같습니다.

첫째, 이중 저장 방식입니다. 새 사용자와 로그인 시 SHA-256이나 bcrypt로 다시 해시하여 별도 컬럼에 저장합니다.

둘째, 점진적 전환 방식입니다. 사용자가 로그인할 때마다 기존 MD5 해시를 검증하고, 성공하면 새 알고리즘으로 업데이트합니다.

셋째, 강제 재설정 방식입니다. 보안이 중요한 서비스라면 모든 사용자에게 비밀번호 재설정을 요청합니다.

마무리#

MD5는 역사적으로 중요한 해시 함수이며, 지금도 무결성 검사나 캐시 키 생성 같은 비보안 영역에서는 널리 사용됩니다. 그러나 충돌 공격이 실용화된 지 오래이므로 보안이 조금이라도 관련된 곳에서는 사용해서는 안 됩니다.

해시 함수를 선택할 때는 용도를 먼저 생각해야 합니다. 무결성 검사인지, 비밀번호 저장인지, 서명인지에 따라 적절한 알고리즘이 다릅니다.

이 글이 MD5를 올바르게 이해하고 사용하는 데 도움이 되었으면 합니다.

MD5 해시 완벽 가이드: 원리부터 활용까지
https://iyu6.com/posts/md5-korean-guide/
作者
yuyuovo
发布于
2026-09-14
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

评论

正在加载评论...