간단한 MD5 해시 값 하나가 필요할 뿐인데 검색 결과는 온통 암호학 논문 같은 설명이라 막막했던 경험이 있으실 겁니다. MD5는 어떤 길이의 데이터든 항상 128비트, 즉 32자리 16진수 문자열로 바꿔 주는 해시 함수입니다. 파일이 온전히 내려받아졌는지 확인하거나 두 데이터가 동일한지 빠르게 비교할 때 여전히 현장에서 널리 쓰이고 있습니다.
MD5는 어떤 원리로 동작할까요
MD5는 입력값을 512비트 블록 단위로 자른 뒤, 네 개의 32비트 레지스터에 64회에 걸쳐 반복적으로 섞어 넣는 방식으로 동작합니다. 이 연산은 한 방향으로만 진행되기 때문에 결과값만 보고 원본을 되돌리는 일은 설계상 불가능합니다. 실무에서 기억해야 할 특성은 세 가지로 정리됩니다.
- 같은 입력은 언제 어느 기기에서 실행해도 항상 동일한 32자리 결과를 냅니다.
- 입력에서 단 한 글자, 심지어 공백 하나만 바뀌어도 결과 전체가 완전히 달라집니다.
- 결과 길이는 입력이 1바이트든 10기가바이트든 항상 32자로 고정됩니다.
d41d8cd98f00b204e9800998ecf8427e는 빈 문자열의 MD5 값입니다. 계산 결과가 이 값으로 나온다면 입력이 비어 있었다는 뜻이므로 파일 경로나 변수부터 다시 확인해 보시는 것이 좋습니다.간단한 MD5 해시 만드는 3단계
복잡해 보이지만 실제 작업은 세 단계면 끝납니다. 순서대로만 따라가면 결과가 어긋날 일이 거의 없습니다.
- 대상을 명확히 정합니다. 해시할 것이 문자열인지 파일인지 먼저 구분해야 합니다. 문자열의 경우 끝에 줄바꿈 문자가 붙느냐 아니냐에 따라 결과가 완전히 달라지므로, 비교 대상과 같은 조건인지 확인이 필요합니다.
- 실행 방법을 고릅니다. 한두 번 확인하는 정도라면 운영체제에 기본 탑재된 명령어가 가장 빠르고, 여러 값을 반복해서 다뤄야 한다면 웹 도구나 코드가 편합니다.
- 결과를 검증합니다. 출력된 32자리 문자열을 배포처가 제공한 기준값과 비교합니다. 대소문자는 의미가 없으므로 소문자로 통일해서 대조하면 눈으로 확인하기 수월합니다.
파일 여러 개를 한꺼번에 처리하거나 값을 반복해서 대조해야 한다면 해시 생성기를 활용해 결과를 바로 붙여 넣고 비교하는 방식이 훨씬 손이 덜 갑니다.
운영체제별 명령어 한눈에 비교
별도 프로그램을 설치하지 않아도 대부분의 환경에는 MD5 계산 도구가 이미 들어 있습니다.
| 환경 | 파일 해시 | 문자열 해시 |
|---|---|---|
| Windows (CMD) | certutil -hashfile file.zip MD5 | 기본 지원 없음 |
| Windows (PowerShell) | Get-FileHash file.zip -Algorithm MD5 | 스트림 변환 필요 |
| macOS | md5 file.zip | md5 -s "text" |
| Linux | md5sum file.zip | echo -n "text" | md5sum |
echo로 문자열을 해시할 때는 반드시 -n 옵션을 붙여야 합니다. 이 옵션이 없으면 자동으로 붙는 줄바꿈 문자까지 계산에 포함되어, 다른 도구로 뽑은 값과 절대 일치하지 않습니다.써도 되는 경우와 쓰면 안 되는 경우
MD5는 2004년에 충돌 공격이 실증된 이후 암호학적으로는 폐기된 알고리즘으로 분류됩니다. 서로 다른 두 데이터가 같은 해시 값을 갖도록 의도적으로 만들어 내는 일이 일반 PC에서도 가능해졌기 때문입니다. 다만 이것이 MD5를 아예 쓰지 말라는 뜻은 아닙니다.
- 적합한 용도: 다운로드 파일의 전송 오류 확인, 중복 파일 탐지, 캐시 키 생성, 대용량 데이터 변경 여부 감지
- 부적합한 용도: 비밀번호 저장, 전자서명, 인증서 검증, 위변조 방지가 목적인 모든 무결성 검사
보안이 목적이라면 SHA-256이 사실상 표준입니다. 계산 속도는 MD5보다 다소 느리지만 현대 하드웨어에서는 체감하기 어려운 수준이고, 대부분의 명령어에서 md5sum을 sha256sum으로 바꾸기만 하면 그대로 동작합니다.
결과가 안 맞을 때 점검할 네 가지
계산한 값이 기준값과 다르다고 해서 파일이 손상됐다고 단정하기는 이릅니다. 실제로는 아래 네 가지가 원인인 경우가 대부분입니다.
- 줄바꿈 문자 차이: 텍스트 파일을 윈도우와 리눅스 사이에서 옮기면 줄바꿈이 CRLF와 LF로 자동 변환되어 해시가 달라집니다. 압축 파일이나 바이너리는 이 문제에서 자유롭습니다.
- 문자 인코딩 차이: 한글이 포함된 문자열은 UTF-8이냐 EUC-KR이냐에 따라 바이트 배열 자체가 달라지므로 결과도 달라집니다.
- 보이지 않는 공백: 값을 복사해 붙여 넣는 과정에서 앞뒤에 공백이나 탭이 딸려 오는 경우가 의외로 많습니다.
- 다운로드 미완료: 파일 크기부터 원본과 대조해 보시기 바랍니다. 용량이 다르다면 해시를 계산할 필요도 없이 재다운로드가 답입니다.
이 네 가지를 모두 확인했는데도 값이 어긋난다면, 그때는 전송 과정에서 실제로 데이터가 손상됐거나 배포처가 제공한 기준값 자체가 갱신되지 않았을 가능성을 살펴봐야 합니다. 기준값이 게시된 날짜와 파일의 최종 수정일을 함께 비교해 보면 원인이 대체로 드러납니다.