1 분 소요

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를 써도 큰 문제는 없지만, 굳이 그럴 이유도 없다.

덧붙여

값을 조회해주는 온라인 사이트에 실제 서비스에서 쓰는 해시값을 붙여넣는 것은 피하는 게 좋다. 조회 기록이 그대로 남고, 그 자체가 정보 유출이 된다.

참고자료

댓글 남기기