해시 생성기

텍스트의 MD5와 SHA 해시를 생성하고 예상 체크섬과 대조할 수 있습니다.

입력
MD5깨짐
SHA-1깨짐
SHA-256
SHA-384
SHA-512

해시 함수가 실제로 하는 일

암호학적 해시 함수는 임의 크기의 입력을 받아 고정 길이의 바이트열 — 다이제스트, 즉 "해시" — 을 냅니다. 한 글자를 주든 장편 소설을 주든 MD5는 늘 16바이트, SHA-256은 늘 32바이트를 돌려줍니다. 같은 입력은 늘 같은 다이제스트를 내고, 입력 어딘가의 1비트를 바꾸면 출력의 약 절반 비트가 바뀝니다. 거의 같은 두 파일이 전혀 무관한 해시를 갖는 이유입니다.

결정적인 성질은 함수가 한 방향으로만 돈다는 점입니다. 파일의 해시를 계산하기는 빠르지만, 해시에서 파일을 복원하기는 그저 느린 것이 아니라 원리적으로 불가능합니다. 고정 길이 출력이 무한한 입력을 부호화할 수 없기 때문입니다. 해시는 지문이지 암호화된 복사본이 아닙니다 — 복호화할 것이 없습니다.

사람이 실제로 해시를 쓰는 목적

  • 다운로드 검증: 프로젝트가 릴리스의 SHA-256을 공개하면, 받은 파일을 해시해 다이제스트가 맞으면 바이트가 온전히 도착한 것입니다.
  • 변경 감지: 버전 관리·백업·중복 제거 시스템은 파일 전체가 아니라 해시를 비교합니다. 32바이트 비교가 기가바이트 비교보다 훨씬 싸기 때문입니다.
  • 하위 리소스 무결성: 웹 페이지가 CDN에서 불러오는 스크립트의 Base64 해시를 고정하면, 맞지 않을 때 브라우저가 그 파일 실행을 거부합니다.
  • 비밀번호 저장 — 다만 맨 해시가 아니라 목적에 맞게 느린 함수로. 아래 참조.

이것들의 공통점에 주목하세요: 해시는 더 큰 무언가의 간결한 대역으로, 그 물건 자체를 보내거나 저장하지 않고 "이것이 내가 기대한 그것과 같은가?"에 답하는 데 쓰입니다.

MD5와 SHA-1은 깨졌다 — 실무에서 그 뜻

해시 함수는 누군가 충돌을 구성할 수 있게 된 시점에 깨진 것으로 봅니다: 같은 다이제스트를 내는 서로 다른 두 입력입니다. MD5 충돌은 2004년 이래 평범한 하드웨어에서 계산할 수 있었고, 2017년 SHAttered 공격은 동일한 SHA-1 해시를 갖는 서로 다른 두 PDF 파일을 냈습니다. 이 도구가 두 알고리즘에 표시를 단 이유입니다.

실무상 결과는 "절대 쓰지 말라"보다 좁습니다. 충돌은 두 파일을 모두 다루는 공격자가 악의적인 것을 무해한 것의 다이제스트에 맞출 수 있음을 뜻하므로, MD5와 SHA-1은 더는 파일이 적대자에게 변조되지 않았음을 증명하지 못합니다. 우연한 손상 — 잘린 다운로드, 디스크에서 뒤집힌 비트 — 을 감지하기에는 지금도 충분하며, 다시 쓰이지 않을 레거시 시스템, ETag 헤더, 오래된 패키지 매니페스트에서 계속 만나게 됩니다.

경험칙: 물음이 "이것이 전송 중에 상했나?"라면 MD5로 충분합니다. 물음이 "누군가 일부러 바꿔치웠나?"라면 SHA-256 이상을 쓰세요.

절대 비밀번호를 이것들로 해시하지 마라

MD5, SHA-1, 심지어 SHA-256도 빠르게 돌도록 설계되었고, 속도는 비밀번호 저장에 바로 그른 성질입니다. 현대 GPU는 초당 수십억 개의 SHA-256 해시를 계산하므로, 맨 해시로 저장된 비밀번호를 훔친 데이터베이스는 엄청난 규모로 공격받을 수 있습니다 — 같은 비밀번호가 늘 같은 다이제스트를 내므로 미리 계산한 표가 그것을 더욱 싸게 만듭니다.

비밀번호 저장에는 일부러 느리고 솔트를 붙이고 메모리를 많이 쓰는 함수가 필요합니다: Argon2id, scrypt, bcrypt입니다. 비밀번호마다 고유한 랜덤 솔트를 더해 같은 비밀번호라도 다이제스트를 공유하지 않게 하고, 비용을 조절할 수 있어 추측 한 번마다 공격자에게 실제 시간과 메모리를 물립니다. 이 도구는 체크섬과 지문을 위한 것이지 비밀번호 해싱을 위한 것이 아닙니다.

다이제스트 읽기와 비교하기

같은 다이제스트를 여러 방식으로 쓸 수 있습니다. 소문자 16진수가 표준 명령줄 도구가 표시하는 것이고, 대개 그것과 대조하게 됩니다:

md5sum file.iso                  # Linux
sha256sum file.iso               # Linux
shasum -a 256 file.iso           # macOS
Get-FileHash file.iso -Algorithm SHA256   # PowerShell(대문자로 표시)
certutil -hashfile file.iso SHA256        # Windows(대문자로 표시)

16진수의 대소문자에는 뜻이 없습니다 — PowerShell과 certutil은 대문자를, Unix 도구는 소문자를 표시하고 둘은 같은 값입니다. 그래서 이 도구의 대조란은 16진수의 대소문자를 무시합니다. Base64는 다른 이야기입니다: 같은 바이트의 더 촘촘한 부호화로, 하위 리소스 무결성과 여러 API가 쓰며 거기서는 대소문자가 뜻을 지니므로 정확히 비교됩니다.

마지막으로 들일 만한 습관: 두 긴 다이제스트를 눈으로 훑어 맞는지 판단하지 마세요. 사람 눈은 기대하는 것을 보는 데 아주 능해, 처음과 끝 몇 글자가 맞아도 아무 뜻이 없습니다. 기대값을 붙여넣어 비교를 정확히 하게 하세요.

자주 묻는 질문

제 텍스트가 서버로 전송되나요?
아니요. 모든 다이제스트는 브라우저 안에서 계산됩니다 — SHA 계열은 Web Crypto API로, MD5는 사용자의 머신에서 도는 JavaScript로. 입력한 내용이 기기 밖으로 나가지 않습니다.
해시를 되돌려 원래 텍스트를 얻을 수 있나요?
아니요. 해시는 고정 길이 지문이지 암호화된 복사본이 아니라, 원본을 그것에서 복원할 수 없습니다. "MD5 복호화"를 내세우는 사이트는 미리 계산한 흔한 입력의 표에서 당신의 해시를 찾는 것일 뿐이라, 짧거나 예측 가능한 텍스트에만 통합니다.
여기서 MD5와 SHA-1에 경고가 붙는 이유는 무엇인가요?
둘 다 충돌이 현실적이기 때문입니다: 같은 다이제스트를 공유하는 서로 다른 두 입력을 구성할 수 있습니다. 그래서 파일이 일부러 변조되지 않았음을 증명하는 데는 맞지 않지만, 우연한 손상을 잡기에는 지금도 충분합니다.
어떤 알고리즘을 써야 하나요?
SHA-256이 무난한 기본값이며 오늘 대부분의 프로젝트가 공개하는 것입니다. SHA-512는 이 용도로 유의미하게 더 안전하지는 않지만 64비트 하드웨어에서 더 빠릅니다. MD5나 SHA-1은 제어할 수 없는 무언가가 이미 그것을 요구할 때만 쓰세요.
이것으로 비밀번호를 해시할 수 있나요?
할 수는 있지만 그 결과를 저장하면 안 됩니다. 비밀번호 저장에는 Argon2id, scrypt, bcrypt 같은 느리고 솔트 붙은 함수가 필요합니다 — 이것들 같은 빠른 해시야말로 훔친 비밀번호 데이터베이스를 깨기 쉽게 만드는 것입니다.
공백이나 줄바꿈을 더하면 해시가 바뀌는 이유는 무엇인가요?
공백도 입력의 일부이기 때문입니다. 끝의 줄바꿈은 해시가 기대와 맞지 않는 가장 흔한 이유 중 하나입니다 — 터미널이나 편집기에서 복사한 텍스트는 눈에 보이지 않는 줄바꿈을 지니는 경우가 흔합니다.
한국어, 아랍어, 이모지를 올바르게 다루나요?
네. 텍스트는 해싱 전에 UTF-8 바이트로 인코딩됩니다. 이것은 다른 모든 도구가 쓰는 표준이라, 여기서 "안녕하세요"나 이모지를 해시하면 같은 문자를 담은 UTF-8 파일에 대한 md5sum이나 sha256sum과 같은 다이제스트가 나옵니다.
텍스트는 해시할 수 있는데 파일은 못 하는 이유는 무엇인가요?
Web Crypto에는 스트리밍 다이제스트 API가 없어 파일은 해싱 전에 전체를 메모리에 읽어야 하고, 손으로 쓴 MD5는 큰 파일에서 눈에 띄게 느립니다. 텍스트 해싱은 페이지를 멈추는 파일 해싱을 제공하기보다 흔한 경우를 정직하게 다룹니다.