해시(Hash)란? 암호화와 무엇이 다른가요?
해시 함수는 길이가 제각각인 입력(글자 한 줄이든 수 GB 파일이든)을 받아 항상 같은 길이의 값(해시값, 다이제스트)을 내놓는 함수입니다. 좋은 암호학적 해시 함수는 세 가지 성질을 갖도록 설계됩니다. 첫째, 같은 입력은 언제나 같은 출력을 냅니다. 둘째, 출력에서 입력을 거꾸로 알아내기가 현실적으로 불가능합니다(역상 저항성). 셋째, 서로 다른 두 입력이 같은 출력을 갖도록 찾아내기가 현실적으로 불가능합니다(충돌 저항성). 또 입력이 한 글자만 달라져도 출력이 완전히 달라지는데, 이를 눈사태 효과라고 합니다. 이 도구에서 SHA-256으로 hello와 Hello를 비교하면 앞의 해시 2cf24dba...와 뒤의 185f8db3...는 256비트 중 약 125비트가 다릅니다(직접 계산한 값, 절반 안팎이 바뀌는 것이 정상입니다).
해시는 암호화가 아닙니다. 암호화는 키가 있으면 원문으로 되돌릴 수 있지만, 해시는 되돌리는 경로 자체가 없습니다. 따라서 "해시값을 복호화한다"는 말은 성립하지 않으며, 인터넷에서 "해시 복호화 사이트"라 부르는 것은 흔한 문자열을 미리 계산해 둔 표(레인보우 테이블)에서 값을 찾는 방식일 뿐입니다.
알고리즘별 특성과 보안 상태 비교
출력 길이는 비트 수이며 16진수로 표기하면 자리수는 비트 ÷ 4가 됩니다(아래 표는 이 공식으로 계산). 같은 입력을 여러 알고리즘으로 돌려 보면 길이가 어떻게 달라지는지 위 도구에서 바로 확인할 수 있습니다.
| 알고리즘 | 출력 비트 | 16진수 자리수 | 발표 시기 | 상태 |
|---|---|---|---|---|
| MD5 | 128 | 32자 | 1992 | 충돌 공격 성공, 보안 용도 금지 (단순 체크섬에는 사용 가능) |
| SHA-1 | 160 | 40자 | 1995 | 2017년 실제 충돌 공개(SHAttered), 보안 용도 금지 |
| SHA-256 | 256 | 64자 | 2001 | 현재 널리 쓰이는 표준, 알려진 실용 공격 없음 |
| SHA-384 | 384 | 96자 | 2001 | SHA-512의 절단형, 알려진 실용 공격 없음 |
| SHA-512 | 512 | 128자 | 2001 | 64비트 CPU에서 SHA-256보다 빠른 경우가 많음, 알려진 실용 공격 없음 |
MD5
2004년 중국 연구진이 충돌 쌍을 만드는 방법을 발표한 뒤 충돌 공격이 계속 개선되어, 지금은 일반 컴퓨터로 짧은 시간에 서로 다른 두 파일을 같은 MD5로 만들 수 있습니다. 2012년에는 이 약점이 실제 악성코드(Flame)의 인증서 위조에 쓰인 것으로 알려졌습니다. 그래서 전자서명, 인증서, 무결성 보증처럼 공격자가 개입할 수 있는 용도에는 쓰면 안 됩니다. 반면 파일이 전송 중 깨졌는지 확인하는 단순 체크섬이나 캐시 키, 중복 파일 찾기처럼 "악의적 공격자가 없는" 용도에는 지금도 쓰입니다.
SHA-1
2017년 구글과 CWI 연구진이 SHA-1의 실제 충돌 쌍(SHAttered)을 공개했습니다. 브라우저의 인증서 신뢰에서도 오래전에 퇴출되었고, 미국 NIST는 SHA-1을 단계적으로 폐기해 2030년까지 SHA-2·SHA-3로 전환할 계획이라고 안내했습니다. 과거 버전 관리 시스템 Git이 객체 식별자로 SHA-1을 쓰지만, 이는 서명 용도가 아니고 충돌 탐지 보완이 적용되어 있으며 SHA-256 전환도 진행 중입니다. 새 시스템에서는 선택하지 마세요.
SHA-2 계열 (SHA-256 / SHA-384 / SHA-512)
2001년 미국 NSA가 설계해 NIST가 표준화한 계열로, 인증서·코드 서명·블록체인·패키지 매니저 등 거의 모든 곳에서 쓰입니다. 현재 알려진 실용적인 충돌 공격은 없습니다. SHA-384는 SHA-512를 초기값만 바꿔 절단한 변형입니다. 일반 용도라면 SHA-256이면 충분하고, 64비트 환경에서 속도를 더 내거나 안전 여유를 크게 두고 싶으면 SHA-512를 고릅니다. 이보다 최신인 SHA-3(2015년 표준화)는 내부 구조가 완전히 다른 후속 표준이지만 이 도구가 쓰는 브라우저 Web Crypto API는 SHA-3을 제공하지 않아 계산할 수 없습니다.
길이 확장 공격과 HMAC
MD5, SHA-1, SHA-256, SHA-512는 구조상 "해시(비밀키 + 메시지)" 방식으로 인증값을 만들면 비밀키를 몰라도 메시지 뒤에 데이터를 덧붙인 값을 계산할 수 있는 길이 확장 공격에 취약한 설계입니다. 메시지가 변조되지 않았음을 키로 증명하려면 단순히 키를 앞에 붙여 해시하지 말고 HMAC을 사용하세요. 이 도구는 키 없는 일반 해시만 계산합니다.
비밀번호를 SHA-256 같은 해시 하나로만 저장하면 안 되는 이유
"비밀번호는 해시로 저장한다"는 말은 절반만 맞습니다. 평문 저장보다는 낫지만, MD5나 SHA-256 같은 범용 해시 하나만으로는 비밀번호 저장에 부적합합니다. 이유는 세 가지입니다.
- 너무 빠릅니다. 범용 해시는 속도를 위해 설계되었습니다. 그래픽카드(GPU) 한 장으로도 초당 수십억 번 이상 계산할 수 있어, 유출된 해시를 상대로 흔한 비밀번호를 대입하는 공격이 순식간에 끝납니다.
- 같은 비밀번호는 같은 해시가 됩니다. 솔트(사용자마다 다른 무작위 값)가 없으면 레인보우 테이블로 한꺼번에 풀리고, 같은 해시를 가진 사용자가 같은 비밀번호임이 드러납니다.
- 사람이 정하는 비밀번호는 경우의 수가 작습니다. 해시가 안전해도
password1같은 흔한 비밀번호는 사전 대입으로 찾아집니다.
올바른 방법은 비밀번호 전용으로 일부러 느리게 설계된 함수인 Argon2id, scrypt, bcrypt, PBKDF2를 쓰는 것입니다. 이 함수들은 솔트를 내장하거나 요구하고, 연산 비용(반복 횟수, 메모리)을 조절할 수 있습니다. 어떤 함수와 어떤 파라미터를 쓸지는 OWASP의 Password Storage Cheat Sheet 같은 최신 권고를 확인하세요. 이 페이지의 도구는 SHA 계열 범용 해시를 계산할 뿐이므로 비밀번호 저장 로직을 만드는 데 그대로 쓰면 안 됩니다.
해시값 활용법
다운로드 파일 무결성 확인
소프트웨어 배포처가 파일과 함께 SHA-256 값을 공개하는 경우, 위에서 파일을 선택해 계산한 값과 비교하면 전송 오류나 변조 여부를 알 수 있습니다. 비교창에 공개값을 붙여넣으면 대소문자·앞뒤 공백을 무시하고 일치 여부를 알려 줍니다. 단, 해시값을 같은 웹페이지에서 받았다면 그 페이지가 해킹된 경우 두 값이 모두 바뀔 수 있습니다. 해시값은 파일과 다른 경로(공식 사이트 HTTPS, 서명된 릴리스 노트 등)에서 확인하는 것이 안전합니다.
데이터 중복 검사와 변경 감지
두 파일이 같은지 내용을 일일이 비교하는 대신 해시를 비교하면 됩니다. 설정 파일이 바뀌었는지 확인하거나 캐시 키를 만들 때도 많이 씁니다. 이런 용도에서는 SHA-256이면 충분하고, 악의적 공격자가 없다면 MD5로도 실무상 문제는 없습니다.
검산 예시와 흔한 실수
검산 예시 1: 텍스트 abc의 SHA-256은 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad, MD5는 900150983cd24fb0d6963f7d28e17f72입니다. NIST 표준 시험 벡터와 일치하므로, 이 도구가 올바르게 작동하는지 확인하는 용도로 쓸 수 있습니다. 검산 예시 2: 텍스트 hello는 SHA-256 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824이지만, 끝에 줄바꿈 한 번을 더한 hello+엔터는5891b5b5...로 전혀 다른 값이 됩니다.
- 눈에 안 보이는 문자: 끝의 공백, 줄바꿈, 윈도우(CRLF)와 리눅스(LF) 줄바꿈 차이만으로도 해시가 달라집니다. 다른 도구의 값과 안 맞을 때 가장 먼저 의심하세요.
- 인코딩: 이 도구는 텍스트를 UTF-8 바이트로 바꿔 계산합니다. EUC-KR 등 다른 인코딩 기준의 값과는 한글이 포함되면 일치하지 않습니다.
- 텍스트와 파일의 차이: 메모장으로 저장한 텍스트 파일은 BOM이나 줄바꿈이 붙어 있을 수 있어 입력창에 붙여넣은 값과 파일 해시가 다를 수 있습니다. 파일의 정확한 해시는 반드시 파일로 선택해 계산하세요.
- 해시 길이 혼동: 64자 16진수는 SHA-256, 128자는 SHA-512, 32자는 MD5입니다. 길이만 봐도 알고리즘을 추정할 수 있습니다.
이 도구의 한계
파일은 200MB까지 한 번에 메모리에 읽어 계산하므로 그보다 큰 파일(ISO 이미지 등)은 운영체제 기본 명령(윈도우의 certutil -hashfile 파일 SHA256, 맥·리눅스의 shasum -a 256 파일)을 쓰는 것이 낫습니다. MD5는 브라우저 Web Crypto API가 지원하지 않아 이 페이지 안에 직접 구현해 계산하며, 표준 시험 벡터와 Node.js 결과로 검증했습니다. HMAC, 솔트 적용, 비밀번호 해시(bcrypt·Argon2)는 지원하지 않습니다. 입력한 내용과 파일은 서버로 전송되지 않고 브라우저 안에서만 처리됩니다.
자주 묻는 질문
해시값에서 원본 텍스트를 알아낼 수 있나요?
수학적으로 역산하는 방법은 없습니다. 다만 짧거나 흔한 문자열은 후보를 계산해 대조하는 방식(사전 공격, 레인보우 테이블)으로 찾아질 수 있으므로, 해시를 했다는 사실이 원문 보호를 보장하지는 않습니다.
공백이나 줄바꿈도 결과에 영향을 주나요?
네. 해시는 바이트 단위로 계산되므로 공백 하나, 줄바꿈 하나, 대소문자 차이에도 완전히 다른 값이 나옵니다. 다른 도구와 값이 다르면 줄바꿈과 인코딩부터 확인하세요.
MD5나 SHA-1은 이제 쓰면 안 되나요?
보안 용도(서명, 인증서, 비밀번호, 변조 방지)에는 쓰면 안 됩니다. 반면 전송 오류 확인이나 중복 파일 찾기 같은 비보안 용도에서는 여전히 흔히 쓰입니다. 새로 설계한다면 SHA-256 이상을 기본으로 선택하세요.
비밀번호를 SHA-256으로 해시해서 저장하면 안전한가요?
충분하지 않습니다. SHA-256은 매우 빠르게 계산되어 유출 시 대입 공격에 취약하고, 솔트 처리도 직접 해야 합니다. 비밀번호 저장에는 Argon2id, bcrypt, scrypt, PBKDF2 같은 전용 함수를 쓰세요.
같은 해시값이 나오는 서로 다른 입력이 존재하나요?
수학적으로는 입력이 무한하고 출력은 유한하므로 반드시 존재합니다(비둘기집 원리). 중요한 것은 그런 입력을 현실적으로 찾을 수 있느냐이며, MD5와 SHA-1은 찾을 수 있다는 것이 증명되었고 SHA-2 계열은 아직 찾는 방법이 알려지지 않았습니다.
관련 도구
- 비밀번호 생성기 - 추측하기 어려운 비밀번호 만들기
- Base64 인코더/디코더 - 해시와 달리 되돌릴 수 있는 인코딩
- UUID 생성기 - 고유 식별자 생성
- JWT 디코더 - 서명 방식(HS256 등) 확인