해시 생성기
텍스트의 MD5와 SHA 해시를 생성하고 예상 체크섬과 대조할 수 있습니다.
해시 함수가 실제로 하는 일
암호학적 해시 함수는 임의 크기의 입력을 받아 고정 길이의 바이트열 — 다이제스트, 즉 "해시" — 을 냅니다. 한 글자를 주든 장편 소설을 주든 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는 큰 파일에서 눈에 띄게 느립니다. 텍스트 해싱은 페이지를 멈추는 파일 해싱을 제공하기보다 흔한 경우를 정직하게 다룹니다.