MD5 해시 생성 도구
온라인 MD5 암호화, 16비트 및 32비트 출력 지원, 대소문자 변환
형식 설정
MD5 암호화란 무엇인가?
MD5(메시지 다이제스트 알고리즘 5)는 1991년 미국 암호학자 로널드 리베스트가 설계한 널리 사용되는 암호화 해시 함수입니다. MD5는 모든 길이의 데이터를 고정된 128비트(16바이트) 해시 값으로 매핑할 수 있으며, 일반적으로 32개의 16진수로 표시됩니다. MD5는 데이터 무결성 검증, 비밀번호 저장, 디지털 서명 등에 널리 사용되었습니다. 그러나 2004년 중국 암호학자 왕샤오윈과 그녀의 팀이 MD5에서 충돌 취약점을 발견하여 공격자가 동일한 MD5 값을 가진 두 개의 다른 데이터를 구성할 수 있게 되었습니다. 따라서 MD5는 더 이상 보안에 민감한 시나리오에 적합하지 않습니다. MD5 출력 형식은 두 가지 유형이 있습니다: 표준 32비트(완전한 해시 값)와 잘린 16비트(32비트 값의 중간 16자). 이 도구는 대문자 또는 소문자 표시 옵션과 함께 두 가지 출력 형식을 모두 지원합니다.
사용 방법
사용 방법
- 입력 필드에 암호화할 텍스트를 입력하세요
- 출력 형식을 선택하세요: 대문자 32비트, 소문자 32비트, 대문자 16비트, 또는 소문자 16비트
- MD5 값이 자동으로 계산되어 표시됩니다
- '복사' 버튼을 클릭하여 결과를 복사하세요
출력 형식 설명
- 체크섬, 캐시 키 또는 레거시 API 필드에 완전한 MD5 다이제스트가 필요할 때 32자 출력을 사용하세요.
- 레거시 시스템이 명시적으로 전체 다이제스트의 중간 16자를 요구할 때만 16자 출력을 사용하세요.
대소문자 설명
- 대문자와 소문자 MD5 값은 동일한 16진수 바이트를 포함하며, 차이는 표시 형식에만 있습니다.
- MD5 값을 비교할 때 대상 시스템에서 요구하는 정확한 대소문자를 일치시켜 잘못된 불일치를 방지하세요.
활용 사례
기술 원리
MD5(메시지 다이제스트 알고리즘 5)는 1991년 MIT의 Ronald Rivest가 설계하여 RFC 1321로 발표되었으며, 깨진 MD4를 대체했습니다. 1990년대와 2000년대의 주력 해시 함수로, 파일 무결성 검사, 비밀번호 저장(솔트 없이 부적절하게 사용), 디지털 서명, 악성코드 지문 생성, `md5sum`, MySQL의 `MD5()`, Git의 이전 오브젝트 스토어, `openssl dgst -md5` 등 다양한 도구에서 기본 다이제스트로 사용되었습니다. 출력은 128비트(16바이트)이며 거의 항상 32자의 소문자 16진수로 표시됩니다. 설계는 Merkle-Damgård 구조를 따릅니다: 메시지를 512비트의 배수로 패딩하고, 64비트 리틀엔디안 길이를 추가한 뒤, 각 512비트 블록에 대해 압축 함수를 반복합니다. 128비트 상태는 A, B, C, D 네 개의 32비트 레지스터에 노출되며, 고정 상수(0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 — nothing-up-my-sleeve 값으로, 리틀엔디안으로 표현한 2, 3, 5, 10의 제곱근)로 초기화됩니다. 각 512비트 블록은 16개의 32비트 워드 M[0..15]로 분할되고 4라운드 x 16단계(총 64단계)를 거칩니다. 라운드 함수는 F = (X AND Y) OR (NOT X AND Z), G = (X AND Z) OR (Y AND NOT Z), H = X XOR Y XOR Z, I = Y XOR (X OR NOT Z)입니다. 각 단계는 하나의 라운드 함수, 메시지 워드, 라운드 상수 T[i] = floor(2^32 * |sin(i+1)|), 그리고 단계별 특정 비트 왼쪽 회전을 결합한 뒤 결과를 상태에 다시 더합니다. 4개 라운드의 설계 의도: 라운드 1은 빠르고 비선형적, 라운드 2는 병렬화 가능, 라운드 3은 더 적극적으로 혼합, 라운드 4는 강력한 확산으로 마무리합니다. 최종 상태가 전체 메시지의 MD5이며, 이것이 MD5를 양자 컴퓨터 이전 의미의 단방향 함수로 만드는 이유입니다. 붕괴: 충돌 저항성이 깨졌으며, 이것이 암호학적 사용에서 유일하게 중요한 사실입니다. Wang 등은 2004년 완전한 충돌 공격을 발표했으며(CFRG 공격으로 PC에서 몇 시간 만에 충돌 검색이 가능해짐), 2008년 연구자들은 MD5 충돌을 이용하여 유효한 CA 인증서를 위조했고(Steven 등이 발표한 선택 접두사 충돌 공격), 2012년 Flame 악성코드는 아직 공개되지 않은 MD5 충돌을 악용하여 Microsoft 코드 서명 인증서를 위조했습니다. 2004년 논문은 충돌 검색 공간을 2^64에서 약 2^24로 줄였으므로, 몇 시간의 연산 능력만 있으면 동일한 MD5를 가진 두 메시지를 생성할 수 있습니다. Flame 이후 Microsoft는 Authenticode에서 MD5를 명시적으로 금지했고, 브라우저는 2014~2017년에 MD5 서명 TLS 인증서를 폐기했으며, IETF는 TLS, SSH, IPsec에서 MD5를 오래전부터 비권장 처리했습니다. 최신 x86-64 노트북의 성능 수치: MD5는 코어당 400~700MB/s(대용량 입력에서는 메모리 대역폭 제한), SHA-256은 200~300MB/s, SHA-512는 64비트 CPU에서 64비트 워드 연산 덕분에 더 빠릅니다. 비밀번호 해싱에 대해서는 처리량과 관계없이 MD5가 부적합하며, bcrypt/scrypt/Argon2id가 GPU 가속을 방지하도록 의도적으로 조정 가능합니다. 단일 RTX 4090에서 Hashcat은 MD5를 약 60GH/s(기가해시/초)로 벤치마크하며, 같은 GPU에서 SHA-256보다 7~8배 빠릅니다. 이 격차가 MD5가 위험한 이유입니다: GPU가 사전 계산 테이블을 시간 단위(연 단위가 아닌)로 탐색할 수 있기 때문입니다. Web Crypto의 `crypto.subtle.digest('MD5', bytes)`는 Chrome, Edge, Firefox 102+에서 거의 디스크 속도로 실행되며, 이전 브라우저는 순수 JS 구현(SparkMD5 또는 자체 구현)으로 50~150MB/s로 폴백합니다. RFC 1321의 테스트 벡터: 빈 문자열은 d41d8cd98f00b204e9800998ecf8427e, 'a'는 0cc175b9c0f1b6a831c399e269772661, 'abc'는 900150983cd24fb0d6963f7d28e17f72. 출력이 이와 일치하지 않으면 버그는 거의 항상 인코딩 문제(JS 문자열을 UTF-8 바이트 대신 JS MD5 구현에 직접 전달)이지 알고리즘 자체가 아닙니다.
- Merkle-Damgård 구조는 MD5를 길이 확장 공격에 취약하게 합니다: H(secret || msg)가 주어지면 공격자는 secret을 모르더라도 H(secret || msg || padding || extra)를 계산할 수 있습니다. 이것이 MD5(secret || message)가 안전한 MAC가 아닌 이유이며, 대신 이 공격에 저항하는 다른 구조(두 키의 중첩 해시)를 사용하는 HMAC-MD5(RFC 2104) 또는 HMAC-SHA256을 사용해야 합니다.
- 테스트 벡터(RFC 1321): 빈 문자열은 d41d8cd98f00b204e9800998ecf8427e, 'a'는 0cc175b9c0f1b6a831c399e269772661, 'abc'는 900150983cd24fb0d6963f7d28e17f72. 구현에서 이 값을 생성하지 못하면 버그는 거의 항상 인코딩 문제(TextEncoder로 UTF-8 바이트를 전달하지 않고 JavaScript 문자열을 JS MD5 구현에 직접 전달)이지 알고리즘 자체가 아닙니다.
- 해시 속도: 최신 x86-64 CPU의 단일 코어는 MD5를 약 400~700MB/s로 처리하며, 대용량 입력에서는 메모리 대역폭에 의해 제한됩니다. SHA-256은 약 30% 느린 200~300MB/s이며, SHA-512는 64비트 워드 연산 덕분에 64비트 CPU에서 더 빠릅니다. 비밀번호 해싱에 대해서는 bcrypt(cost factor 12) / scrypt / Argon2id가 정확한 선택지로, 의도적으로 느리고 GPU 가속을 방지하도록 조정 가능합니다.
- 4개의 라운드 함수 F, G, H, I는 문장으로 읽히도록 의도적으로 이름 붙여졌습니다('FiGiHI' / 'figi hi' — Rivest의 시그니처). 각 함수는 비트 연산만 사용하며 서로 다른 혼합 구조를 가져 알고리즘이 암호 해독 하에서 선형 또는 아핀 시스템으로 붕괴하지 않습니다. DES/AES의 S-box 개념은 MD5에 존재하지 않으며, 보안은 치환 테이블이 아닌 메시지 워드 확장과 회전 상수에서 나옵니다.
- 단일 RTX 4090의 Hashcat 벤치마크: MD5는 약 60GH/s(순수 해시 기준), 솔트 포함 MD5는 30GH/s. 같은 GPU에서 SHA-256은 8GH/s입니다. 7~8배의 격차가 공격자가 MD5를 선호하는 이유입니다: GPU가 사전 계산 테이블을 수 시간 만에 탐색할 수 있기 때문입니다. 오프라인 공격에 저항해야 하는 모든 경우 SHA-256, bcrypt 또는 Argon2id를 사용하세요.
- '더블 MD5'(MD5(MD5(x)))는 때때로 오래된 PHP 및 MySQL 코드에서 볼 수 있으며, 솔트와 함께 사용되는 경우가 많습니다. 이는 충돌 공격에 도움이 되지 않으며(MD5의 충돌은 O(1)의 추가 작업으로 MD5(MD5())의 충돌이 됨), 역상 검색도 약간만 느출 뿐입니다(2배). 최신 비밀번호 해싱(RFC 9106의 Argon2id, RFC 7914의 scrypt, cost >= 12의 bcrypt)만이 비밀번호 저장의 유일한 정답입니다. 최신 비밀번호 컬럼에 MD5가 보인다면 버그입니다.
- MD5에서 마이그레이션: 현재 MD5를 사용하는 시스템을 유지하는 경우, 올바른 마이그레이션 방법은 이중 쓰기(읽기 시 MD5와 SHA-256 모두 계산, 새 코드 경로에서 SHA-256 우선)를 비권장 기간 동안 수행한 뒤 아무것도 의존하지 않으면 MD5를 제거하는 것입니다. MD5를 강제하는 레거시 프로토콜(NTLM, RADIUS challenge-response, 일부 Kerberos 모드)에서 MD5는 곧 사라지지 않을 것입니다. Microsoft는 2010년에 NTLM을 AES를 사용하도록 패치했지만 호환성을 위해 이전 버전이 기본적으로 여전히 활성화되어 있으므로, 레거시 Windows 시스템이 있다면 NTLMv1을 완전히 비활성화해야 합니다.
- 이 페이지의 구현: Web Crypto를 사용할 수 있는 경우(Chrome, Edge, Firefox 102+) 네이티브 코드에서 거의 디스크 속도로 실행되는 `crypto.subtle.digest('MD5', utf8Bytes)`를 사용합니다. 사용할 수 없는 경우 50~150MB/s로 실행되는 순수 JS 구현(SparkMD5 0.7 또는 자체 구현)을 사용합니다. 두 구현 모두 동일한 출력을 생성하므로 테스트 벡터는 두 백엔드 모두에서 통과합니다. 인코딩 단계는 `new TextEncoder().encode(str)`로 항상 UTF-8 바이트를 제공하며, JavaScript 문자열을 JS 전용 MD5 구현에 직접 전달하면 비ASCII 입력에서 잘못된 해시가 나옵니다.
예시
빈 문자열과 짧은 텍스트
빈 문자열 -> d41d8cd98f00b204e9800998ecf8427e
hello -> 5d41402abc4b2a76b9719d911017c592
RFC: RFC 1321 부록 A.1에서 이러한 테스트 벡터를 정의함대소문자 구분
hello world -> 5eb63bbbe01eeed093cb22bb8f5acdc3
Hello -> 8b1a9953c4611296a827abf8c47804d7
HELLO -> eb61eead90e3b899c6bcbe27ac581660
참고: 단 한 글자만 바뀌어도 해시가 완전히 달라짐 (눈사태 효과)숫자와 구두점
123456 -> e10adc3949ba59abbe56e057f20f883e
Hello, World! -> 65a8e27d8879283831b664bd8b7f0ad4
file.txt -> 3d8e577bddb17db339eae0b3d9bcf180
참고: 구두점이나 공백이 조금만 바뀌어도 완전히 다른 다이제스트가 생성됨MD5를 보안 용도로 권장하지 않는 이유
충돌 공격: 2004년 연구자들이 동일한 MD5 해시를 가진 두 개의 서로 다른
메시지를 만드는 방법을 발견했습니다. 이는 디지털 서명과
인증서 검증을 무력화시킵니다.
보안용으로는 SHA-256 또는 SHA-3 사용:
MD5: 128 bits, 충돌 저항성 무너짐 (실현 가능한 공격)
SHA-256: 256 bits, 실용적인 충돌이 발견되지 않음
SHA-512: 512 bits, 더 큰 안전 마진
NIST: NIST는 2005년부터 암호학적 용도의 MD5 사용을 폐기함
용도: 파일 무결성 검사, 중복 제거, 캐시 키 용도로는 여전히 안전함자주 묻는 질문
MD5는 무엇인가요?
MD5(Message Digest 5, RFC 1321)는 1991년 Ron Rivest가 발표한 128비트 해시 함수입니다. 입력 길이와 무관하게 항상 32자리 16진수 문자열을 반환하며, 입력의 단 1비트만 바뀌어도 결과가 완전히 달라집니다. 최신 CPU에서 초당 수백 MB를 처리할 만큼 빠릅니다.
MD5는 안전한가요?
보안 용도로는 안전하지 않습니다. MD5에 대한 충돌 공격은 2004년부터 실용화되었고, chosen-prefix 충돌도 2007년부터 가능해졌습니다. 디지털 서명, 인증서 해시, 비밀번호 저장, 공격자가 입력 중 하나라도 선택할 수 있는 변조 방지 용도에는 사용하지 마세요.
그래도 MD5를 어디에 쓸 수 있나요?
우발적인 손상 감지에는 여전히 유용합니다. 다운로드 체크섬, 신뢰할 수 있는 파일의 단순 중복 제거, 빠른 ETag 형태의 핑거프린트 등이 그 예입니다. 많은 벤더가 호환성을 위해 SHA-256과 함께 MD5도 계속 게시합니다.
계산은 로컬에서 이루어지나요?
네. 붙여넣은 텍스트의 MD5는 브라우저에서 계산됩니다. 어떤 정보도 업로드되거나 기록되지 않습니다. 해싱하는 동안 네트워크 탭을 확인해 보면 직접 검증할 수 있습니다.
왜 같은 문자열인데 다른 곳에서는 MD5가 다르게 나오나요?
거의 항상 보이지 않는 문자 차이 때문입니다. UTF-8 BOM, 끝의 줄바꿈, LF 대신 CRLF, 한쪽은 UTF-8로 다른 쪽은 UTF-16으로 인코딩하는 경우 등이 흔합니다. MD5 알고리즘 자체는 어떤 구현에서도 완전히 결정적입니다.
대문자 MD5와 소문자 MD5는 같은가요?
네. 출력되는 128비트는 동일하며, 대소문자는 단순히 표시 방식의 차이일 뿐입니다. 검증할 때는 대소문자를 구분하지 않고 비교해야 합니다.
MD5와 MD5(salt + password)의 차이는 무엇인가요?
비밀번호의 단순 MD5는 레인보우 테이블로 손쉽게 깨집니다. 솔트를 추가하면 사전 계산 테이블은 막을 수 있지만, MD5는 비밀번호 해싱에 쓰기에는 여전히 너무 빠릅니다. 비밀번호에는 bcrypt/scrypt/Argon2를 쓰세요. MD5는 솔트 유무를 떠나 비밀번호용으로는 부적합한 도구입니다.