암호학적 해시 함수: 데이터의 지문
해시는 질문 하나에 답합니다. 이 데이터가 예전 그대로인가? 회선이 불안정한 채로 내려받기가 끝났을 때, 아무도 되읽을 수 없는 형태로 비밀번호를 보관해야 할 때, 조용히 고칠 수 없는 영수증이 필요할 때 모두 같은 질문입니다. 암호학적 해시 함수가 그 답을 냅니다.
해시 함수는 크기에 상관없이 어떤 입력이든, 글자 하나부터 수 기가바이트짜리 운영체제 이미지까지, 고정 길이의 바이트 문자열로 변환하는 수학적 알고리즘입니다. 보통 16진수로 표기되는 그 출력을 해시 값, 체크섬, 다이제스트라고 부릅니다.
해시는 지문에 비유하면 이해하기 쉽습니다. 지문이 한 사람의 생물학적 구성을 드러내지 않으면서 그 사람을 특정하듯, 해시는 데이터 내용을 노출하지 않으면서 그 데이터 덩어리를 특정합니다.
갖춰야 할 성질
- 결정적: 같은 입력은 몇 번을 돌려도 언제나 정확히 같은 출력을 냅니다.
- 빠른 계산: 어떤 입력에 대해서도 신속히 값을 내야 병목이 되지 않습니다.
- 역산 불가: 해시 값으로부터 원래 입력을 되돌리는 것이 계산상 불가능해야 합니다. 한 방향으로만 나 있는 길입니다.
- 눈사태 효과: 입력의 아주 작은 변화, 소문자 하나가 대문자로 바뀌거나, 10GB 파일에서 비트 하나가 달라지거나, 가 완전히 다른 해시를 만들어야 하며, 새 값은 이전 값과 아무 연관이 없어 보여야 합니다.
- 충돌 저항: 같은 해시를 내는 서로 다른 두 입력을 찾기가 극히 어려워야 합니다. 입력은 무한하고 출력은 유한하므로 충돌은 이론적으로 존재하지만, 현대의 안전한 알고리즘은 그것을 실제로 찾아내는 일을 불가능에 가깝게 만듭니다.
이 도구의 동작
텍스트를 붙여넣거나 파일을 끌어다 놓으면, 선택한 알고리즘(MD5, SHA-1, SHA-256, SHA-512)으로 입력의 이진 데이터를 처리해 16진수 결과를 보여 줍니다.
모든 계산은 브라우저에서 이루어집니다. 현대의 웹 API는 파일을 읽고 이런 연산을 기기의 CPU에서 직접 수행할 수 있게 해 주므로, 기밀 문서나 사내 코드가 서버로 올라가는 일이 없습니다. 프라이버시뿐 아니라 속도 면에서도 이득인데, 큰 파일의 체크섬을 업로드 진행 막대를 기다리지 않고 바로 얻을 수 있기 때문입니다.
알고리즘 비교
| 알고리즘 | 출력 길이 | 16진수 자릿수 | 상태 | 주된 용도 |
|---|---|---|---|---|
| MD5 | 128비트 | 32자 | 깨짐 / 안전하지 않음 | 보안과 무관한 체크섬, 레거시 환경. |
| SHA-1 | 160비트 | 40자 | 폐기 권고 / 취약 | 레거시 버전 관리(Git 저장소). |
| SHA-256 | 256비트 | 64자 | 안전 | 현재 표준: TLS 인증서, 비트코인, 파일 무결성. |
| SHA-512 | 512비트 | 128자 | 안전 | 고보안 용도, 64비트 하드웨어에 최적화. |
MD5
1991년 로널드 리베스트가 MD4를 대체하려고 설계했고, 오랫동안 파일 무결성 검증과 비밀번호 저장의 표준이었습니다. 그러나 암호분석으로 심각한 결함이 드러났습니다. 오늘날 충돌, 같은 MD5를 갖는 서로 다른 두 입력, 을 만드는 데는 일반 소비자용 하드웨어로 몇 초면 충분합니다. 보안과 관련된 어떤 용도에서도 배제되었고, 옛 환경의 간단한 오류 검사로만 남아 있습니다.
SHA-1
미국 NSA가 설계해 1995년 공개했으며 160비트 값을 냅니다. 10년 넘게 웹 인증서와 보안 프로토콜을 떠받쳤지만, 2017년 암스테르담 CWI와 구글 연구진이 같은 SHA-1을 갖는 두 개의 서로 다른 PDF를 제시한 "SHAttered" 공격을 발표했습니다. 이 실제 충돌 이후 주요 브라우저가 SHA-1 인증서를 거부했습니다. Git에서 커밋을 참조하는 데는 여전히 쓰이지만 암호학적 용도로는 안전하지 않습니다.
SHA-2 계열
SHA-1의 구조적 결함을 해결하려고 2001년 공개되었으며 견고함에서 큰 도약을 이뤘습니다. 널리 쓰이는 것은 SHA-256과 SHA-512이고, 현재까지 이 계열에 대해 성공한 암호분석 공격은 없습니다. 오늘날 웹 암호화와 전자 서명, 비트코인 같은 블록체인의 표준입니다.
- SHA-256은 256비트를 내며 보안과 성능의 균형이 좋아 모바일과 데스크톱 모두에서 무난합니다.
- SHA-512는 512비트를 내고 64비트 블록 단위로 처리하므로 64비트 프로세서에서는 오히려 SHA-256보다 빠른 경우가 많습니다.
실제 용도
내려받은 파일 검증
ISO 이미지나 설치 파일, 펌웨어를 받을 때 네트워크가 끊겨 파일이 손상되거나, 누군가 트래픽을 가로채 악성 코드를 심을 위험이 있습니다. 그래서 배포자는 정품 파일의 SHA-256 값을 자기 사이트에 함께 공개합니다. 내려받은 파일의 해시를 계산해 공개된 값과 일치하면 원본 그대로임이 확인됩니다.
중복 제거와 색인
수백만 개의 이미지나 문서를 바이트 단위로 비교해 중복을 찾는 것은 대단히 느립니다. 대신 각 파일의 해시를 저장하면, 짧고 균일하며 결정적이라는 성질 덕분에 데이터베이스가 밀리초 안에 색인하고 비교합니다. 해시가 같은 두 파일은 동일한 것으로 취급됩니다.
버전 관리
Git은 모든 커밋과 트리, 블롭을 내용의 SHA-1 해시로 식별합니다. 이 구조 덕분에 이후의 모든 식별자를 바꾸지 않고서는 이력을 조작할 수 없으며, 저장소가 감사 가능해집니다.
전자 서명과 인증서
은행 사이트에 접속하면 브라우저가 TLS 인증서로 신원을 확인합니다. 인증 기관이 인증서 데이터의 해시를 계산해 자기 개인키로 암호화하고, 브라우저는 그 서명을 복호화한 뒤 인증서의 해시를 다시 계산합니다. 둘이 일치하면 인증서가 진짜이고 도중에 변조되지 않았다는 뜻입니다.
해싱은 암호화가 아닙니다
둘을 혼동하는 일이 흔하지만 구조와 목적이 다릅니다.
- 해싱은 한 방향입니다. 입력을 요약값으로 영구히 변환하며, SHA-256을 원문으로 되돌릴 키나 비법은 존재하지 않습니다. 검증을 위한 것입니다.
- 암호화는 양방향입니다. 읽을 수 있는 자료를 읽을 수 없게 바꿔 안전하게 전달하고, 올바른 키를 가진 쪽이 원문을 복원합니다. 기밀 유지를 위한 것입니다.
흔한 비유로, 해싱은 딸기를 믹서에 넣는 일입니다. 갈린 것에서 딸기를 되살릴 수는 없습니다. 암호화는 딸기를 금고에 넣는 일이어서, 보이지 않을 뿐 열쇠가 있으면 꺼낼 수 있습니다.
구현할 때의 두 가지 주의
비밀번호를 해시만으로 저장하지 마세요. 비밀번호를 해시해 보관하는 것은 맞지만, MD5나 심지어 SHA-256만 쓰는 것은 안전하지 않습니다. 미리 계산된 표와 GPU 클러스터로 무차별 대입이 가능하기 때문입니다. 사용자마다 다른 임의 문자열(솔트)을 더하고, Argon2나 bcrypt, PBKDF2처럼 일부러 느리게 설계된 키 유도 함수를 써야 합니다.
기본값은 SHA-256으로. 레거시 요구사항이나 64비트 성능 최적화가 SHA-512를 요구하는 경우가 아니라면, 데이터 지문과 토큰 색인, 무결성 검사에는 SHA-256이 합리적인 선택입니다. 여전히 안전하고 빠르며 어디서나 표준입니다.