
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를 올바르게 이해하고 사용하는 데 도움이 되었으면 합니다.
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 17 天
部分内容可能已过时
评论