해시 함수란?
해시 함수는 어떤 크기의 입력이든 — 글자 하나, 문단 하나, 파일 전체 — 받아서 고정 길이의 출력(다이제스트 또는 해시)을 만들어냅니다. 같은 입력은 항상 같은 해시를 생성합니다. 입력이 아주 조금만 바뀌어도 완전히 다른 해시가 나옵니다. 그리고 결정적으로, 해시에서 원래 입력을 역산할 수 있는 수학적 방법은 없습니다.
이런 특성 덕분에 해시 함수는 소프트웨어 개발, 보안, 데이터 관리에서 빠질 수 없는 도구입니다. 파일 무결성 검증, 비밀번호 안전 저장, 중복 감지, 디지털 서명, 블록체인의 기반이 됩니다.
해시의 작동 원리
"hello"라는 문자열을 해싱하면, 알고리즘이 비트 연산, 모듈러 연산, 압축 함수 등의 수학적 변환을 거쳐 고정 길이 출력을 만들어냅니다. SHA-256의 경우 입력이 5글자든 500만 글자든 결과는 항상 256비트(16진수 64자)입니다.
좋은 해시 함수의 핵심 속성은 다음과 같습니다.
**결정적**: 같은 입력은 항상 같은 출력. "hello"를 백만 번 해싱해도 매번 같은 결과입니다.
**눈사태 효과**: 입력에서 1비트만 바꿔도 출력 비트의 약 절반이 변합니다. "hello"와 "Hello"의 해시는 전혀 상관없어 보입니다.
**역상 저항성**: 해시값이 주어졌을 때, 그 값을 생성하는 입력을 찾는 것이 계산적으로 불가능합니다.
**충돌 저항성**: 같은 해시를 생성하는 서로 다른 두 입력을 찾기가 극도로 어렵습니다.
주요 해시 알고리즘
MD5
MD5는 128비트(16진수 32자) 다이제스트를 생성합니다. 1991년 로널드 리베스트가 만들었으며, 10년 넘게 파일 무결성 확인과 비밀번호 저장에 널리 사용되었습니다. 그러나 지금은 암호학적으로 깨진 것으로 간주됩니다. 연구자들이 같은 MD5 해시를 가진 서로 다른 파일 두 개를 만드는 실용적 충돌 공격을 시연했습니다.
MD5는 보안과 무관한 용도 — 파일 다운로드 체크섬, 중복 제거 키, 캐시 무효화 식별자 — 에는 여전히 사용할 수 있습니다. 하지만 비밀번호 해싱, 디지털 서명 등 충돌 저항성이 필요한 곳에는 절대 쓰면 안 됩니다.
SHA-1
SHA-1은 160비트(16진수 40자) 다이제스트를 생성합니다. NSA가 개발해서 1995년에 공개했으며, 디지털 인증서, Git 커밋 등에서 표준 해시 함수로 쓰였습니다. 2017년 구글이 최초의 실용적 SHA-1 충돌("SHAttered" 공격)을 시연한 후, 보안 용도에서는 더 이상 사용하지 않습니다.
Git은 아직 커밋 식별에 SHA-1을 쓰지만 SHA-256으로 전환 중입니다. 새 프로젝트에서는 SHA-2 계열 알고리즘을 사용하세요.
SHA-256
SHA-2 계열에 속하는 SHA-256은 256비트(16진수 64자) 다이제스트를 생성합니다. 현재 가장 널리 사용되는 암호학적 해시 함수입니다. SHA-256에 대한 실용적 공격은 알려진 바 없으며, 비트코인 작업증명, TLS 인증서 등 수많은 보안 프로토콜의 핵심입니다.
보안과 성능의 균형이 좋아서 대부분의 용도에서 기본 선택으로 권장됩니다.
SHA-512
SHA-512는 512비트(16진수 128자) 다이제스트를 생성합니다. SHA-256보다 큰 보안 마진을 제공하며, 64비트 연산을 사용하기 때문에 64비트 프로세서에서는 오히려 더 빠를 수 있습니다.
실용적 활용
파일 무결성 검증
소프트웨어를 다운로드할 때 배포자가 SHA-256 해시를 함께 제공하는 경우가 많습니다. 다운로드 후 파일의 해시를 계산해서 공개된 값과 비교합니다. 일치하면 전송 중 파일이 손상되거나 변조되지 않은 것입니다.
비밀번호 저장
비밀번호는 절대 평문으로 저장하면 안 됩니다. 비밀번호를 해싱해서 해시만 저장합니다. 로그인할 때 입력된 비밀번호를 해싱해서 저장된 해시와 비교합니다. 데이터베이스가 유출되어도 공격자가 얻는 건 해시뿐입니다.
비밀번호 해싱에는 SHA-256보다 bcrypt, scrypt, Argon2 같은 전용 알고리즘이 권장됩니다. 의도적으로 느리게 설계되었고, 솔팅을 포함해서 레인보우 테이블 공격을 방어합니다.
데이터 중복 제거
해싱으로 효율적인 중복 감지가 가능합니다. 대용량 파일을 바이트 단위로 비교하는 대신, 해시를 계산해서 비교합니다. 좋은 알고리즘에서 해시가 같으면 내용도 같습니다. 클라우드 스토리지 서비스가 같은 파일을 여러 번 저장하지 않도록 이 기법을 사용합니다.
디지털 서명
디지털 서명은 해싱과 비대칭 암호화를 결합합니다. 문서 전체를 서명하는 대신(느림), 문서를 해싱하고 해시만 서명합니다. 수신자는 독립적으로 문서를 해싱해서 서명을 검증합니다. 빠르면서도 문서가 수정되지 않았음을 증명할 수 있습니다.
알고리즘 선택 기준
보안이 중요한 곳(디지털 서명, 인증서, 인증)에는 SHA-256 또는 SHA-512를 사용하세요.
무결성 확인(파일 검증, 캐시 키, 중복 제거)에는 SHA-256이 적합합니다. 보안이 관계없고 속도가 중요하면 MD5도 괜찮습니다.
비밀번호 저장에는 범용 해시 함수가 아닌 bcrypt, scrypt, Argon2를 사용하세요.
판단이 어려우면 SHA-256을 선택하세요. 빠르고, 안전하며, 어디서든 지원됩니다.