MD5는 복호화할 수 없다 - 해시와 암호화의 차이
2026년 수정 안내 원래 이 글은 “MD5 복호화 페이지”라는 제목으로 몇몇 웹사이트를 소개하는 내용이었다. 그런데 MD5는 원리적으로 복호화가 불가능하다. 개념 자체를 잘못 알고 쓴 글이라 내용을 전면 수정한다. 소개했던 사이트들도 현재는 모두 접속되지 않는다.
해시는 복호화되지 않는다
MD5는 단방향 해시 함수(one-way hash function) 다. 임의 길이의 입력을 고정 길이(128비트)의 값으로 줄이는 함수인데, 이 과정에서 정보가 손실된다.
입력은 무한히 많고 출력은 2^128가지뿐이므로, 애초에 원본을 되돌릴 수 있는 함수가 아니다. “복호화”라는 말 자체가 성립하지 않는다.
그럼에도 MD5 값을 넣으면 원문을 알려주는 사이트들이 있는데, 이것들이 하는 일은 복호화가 아니라 미리 계산해둔 대응표를 조회하는 것이다.
- 레인보우 테이블 / 사전 공격 — 흔한 문자열 수십억 개를 미리 해시해서 저장해두고, 입력받은 해시값과 같은 것이 있는지 찾는다.
- 그래서
password,123456같은 흔한 값은 바로 나오고, 무작위 문자열은 영원히 나오지 않는다. 예전에 이 글에 “디코드 되는 것도 있고 안되는 것도 있었다”고 적었던 이유가 바로 이것이다.
암호화와 인코딩과 해시는 다르다
원래 글에서 “암호화 즉, 인코딩”이라고 썼는데 이 셋은 전부 다른 개념이다.
| 목적 | 되돌릴 수 있나 | 예 | |
|---|---|---|---|
| 인코딩 | 데이터 표현 형식 변환 | 예 (키 불필요) | Base64, URL 인코딩, UTF-8 |
| 암호화 | 기밀성 보호 | 예 (키 필요) | AES, RSA, ChaCha20 |
| 해시 | 무결성 검증, 지문 생성 | 아니오 | SHA-256, MD5 |
Base64를 “암호화”라고 부르는 경우를 종종 보는데, 키가 없어도 누구나 되돌릴 수 있으므로 암호화가 아니라 인코딩이다.
MD5는 이제 쓰면 안 된다
MD5는 충돌 저항성이 깨졌다. 2004년에 서로 다른 두 입력이 같은 해시값을 갖도록 만드는 방법이 발표됐고, 지금은 일반 PC에서도 몇 초 안에 충돌을 만들 수 있다. SHA-1도 2017년 구글의 SHAttered 연구로 실제 충돌이 공개되었다.
용도별로 지금 써야 할 것은 다음과 같다.
- 무결성 검증 / 서명 — SHA-256 이상 (SHA-2, SHA-3 계열)
- 비밀번호 저장 — 일반 해시를 그대로 쓰면 안 된다. Argon2id를 우선 고려하고, 환경상 어렵다면 bcrypt나 scrypt를 쓴다. 이들은 의도적으로 느리게 설계되어 대량 대입 공격을 어렵게 만들고, 솔트(salt)를 내장해 레인보우 테이블을 무력화한다.
- 파일 중복 확인처럼 보안과 무관한 용도 — MD5를 써도 큰 문제는 없지만, 굳이 그럴 이유도 없다.
덧붙여
값을 조회해주는 온라인 사이트에 실제 서비스에서 쓰는 해시값을 붙여넣는 것은 피하는 게 좋다. 조회 기록이 그대로 남고, 그 자체가 정보 유출이 된다.
댓글 남기기