해시 함수 알아보기
해시 함수는 어떤 입력이든 길이가 고정된 짧은 지문으로 바꿉니다. 이 가이드에서는 MD5, SHA-1, SHA-256이 어디에 유용하고 어디에서 한계가 있는지, 그리고 파일을 공개된 체크섬과 비교하는 방법을 설명합니다.
해시란 무엇인가
암호학적 해시 함수는 어떤 크기의 데이터든 읽어서 고정된 길이의 다이제스트를 만듭니다. MD5는 128비트, SHA-1은 160비트, SHA-256은 256비트이며, 보통 16진수 텍스트로 표시합니다. 같은 입력은 항상 같은 다이제스트를 만들고, 입력이 단 1비트만 바뀌어도 전혀 다른 다이제스트가 나옵니다. 해시는 단방향입니다. 입력을 추측해 결과를 비교하는 방법 외에는 다이제스트에서 입력을 되찾을 수 없습니다.
이 가이드는 일반적인 정보를 제공합니다. 보안 관련 결정을 내릴 때는 소속 조직이나 사용하는 서비스의 요구 사항을 따르세요.
체크섬과 무결성
일상에서 가장 흔한 용도는 파일이 손상 없이 도착했는지 확인하는 것입니다. 다운로드 페이지에서 파일 옆에 SHA-256 값을 공개하기도 합니다. 내려받은 뒤 내 사본의 해시를 계산해 공개된 값과 비교합니다. 값이 일치하면 파일은 게시자가 해시한 파일과 같을 가능성이 매우 높고, 다르면 다운로드가 손상되었거나 다른 버전의 파일입니다.
체크섬은 공개된 값 자체를 믿을 수 있을 때만 도움이 됩니다. 공격자가 같은 페이지의 파일과 체크섬을 모두 바꿀 수 있다면 해시가 일치해도 증명하는 것이 거의 없습니다. 이 문제는 디지털 서명으로 해결합니다.
MD5와 SHA-1을 보안에 쓰면 안 되는 이유
안전한 해시라면 같은 다이제스트를 갖는 서로 다른 두 입력(충돌)을 찾는 것이 현실적으로 불가능해야 합니다. MD5와 SHA-1 모두 실용적인 충돌 공격이 공개되어 있어, 공격자가 해시가 같은 서로 다른 두 파일을 준비할 수 있습니다. 이 때문에 두 알고리즘은 더 이상 디지털 서명, 인증서 등 보안 용도에 적합하지 않은 것으로 여겨집니다.
MD5와 SHA-1은 우발적인 손상은 여전히 감지할 수 있으며, 일부 오래된 시스템은 아직 이 값을 공개합니다. 새로운 작업에는 보통 SHA-256이나 SHA-2 계열의 다른 알고리즘(SHA-384, SHA-512)을 선택합니다.
| 알고리즘 | 다이제스트 길이 | 보안 상태 |
|---|---|---|
| MD5 | 128비트 (16진수 32자) | 충돌 저항성이 깨짐. 기존 체크섬 용도로만 사용 |
| SHA-1 | 160비트 (16진수 40자) | 충돌 저항성이 깨짐. 레거시 용도 |
| SHA-256 | 256비트 (16진수 64자) | 널리 쓰이며 권장됨 |
| SHA-384 / SHA-512 | 384 / 512비트 | 널리 쓰이며 권장됨 |
해싱은 암호화가 아니며, 비밀번호에는 그 이상이 필요합니다
암호화는 올바른 키가 있으면 되돌릴 수 있지만, 해싱은 되돌리도록 설계되지 않았습니다. 그렇다고 해시가 짧거나 예측 가능한 입력을 숨겨 주지는 않습니다. 누구나 흔한 단어나 전화번호를 해시해서 일치하는 값을 찾을 수 있습니다.
그래서 MD5나 SHA-256 같은 빠른 해시만으로는 비밀번호를 저장하기에 적합하지 않습니다. 이런 해시는 빠르게 동작하도록 설계되어 공격자가 매우 많은 추측을 빠르게 시험할 수 있습니다. 비밀번호 저장에는 Argon2, scrypt, bcrypt처럼 이 용도로 만든 느리고 솔트를 쓰는 알고리즘을 사용합니다. 로그인 시스템을 만든다면 범용 해시 대신 유지 관리되는 라이브러리와 해당 플랫폼의 최신 지침을 따르세요.
메시지 인증을 위한 HMAC
일반 해시는 데이터가 바뀌었는지 보여 주지만, 누구나 다시 계산할 수 있습니다. HMAC(해시 기반 메시지 인증 코드)은 HMAC-SHA256처럼 데이터와 비밀 키를 결합합니다. 키를 아는 사람만 올바른 값을 만들 수 있으므로, 받는 쪽은 메시지가 키를 가진 쪽에서 왔고 변조되지 않았는지 확인할 수 있습니다. 웹훅과 API 요청 서명에 HMAC이 흔히 쓰입니다. 키는 비밀로 유지하세요. 키를 가진 사람은 누구나 유효한 코드를 만들 수 있습니다.
같은 텍스트인데 해시가 다른 이유
해시는 눈에 보이는 텍스트가 아니라 바이트를 기준으로 계산됩니다. 다음과 같은 차이가 결과를 바꿉니다.
- 줄바꿈 방식: Windows는 CR LF를, Linux와 macOS는 LF를 씁니다.
- 문자 인코딩: "é"는 UTF-8과 예전 인코딩에서 서로 다른 바이트입니다.
- 끝에 붙은 줄바꿈이나 공백, 또는 파일 맨 앞의 바이트 순서 표시(BOM).
- 입력의 대문자와 소문자 차이.
해시가 일치하지 않으면 이 항목부터 확인하세요. 파일에서 복사한 텍스트를 해시하는 것보다 원본 파일을 해시하는 편이 대개 더 믿을 만합니다. 16진수 출력 자체는 대소문자를 구분하지 않으므로 A1B2와 a1b2는 같은 값입니다.
자주 묻는 질문
MD5나 SHA-256 해시를 복호화할 수 있나요?
아니요. 해시는 암호화된 데이터가 아닙니다. 온라인 "복호화" 서비스는 흔한 입력의 해시를 미리 계산해 둔 표에서 찾아볼 뿐이며, 그래서 단순한 값의 해시는 보호 효과가 거의 없습니다.
다운로드 파일을 확인할 때는 어떤 알고리즘을 써야 하나요?
게시자가 제공하는 알고리즘을 쓰세요. 여러 개를 제공한다면 MD5나 SHA-1보다 SHA-256이나 SHA-512가 더 나은 선택입니다.
해시 생성기는 제 파일을 업로드하나요?
LeedyBox 해시 생성기는 브라우저에서 해시를 계산하므로, 선택한 텍스트나 파일은 사용자의 기기에서 처리됩니다.