오픈소스 프로그램을 다운받으면 배포 페이지에 "SHA-256: a3f2e8..."이라는 긴 문자열이 적혀 있다. 이게 뭔지 모르고 넘기는 사람이 대부분인데, 다운받은 파일이 중간에 변조되지 않았는지 확인하는 데 쓰는 값이다.
해시값이란
어떤 데이터를 넣으면 고정된 길이의 문자열이 나오는 함수의 결과물이다. 같은 입력에는 항상 같은 출력이 나오고, 입력이 1비트만 달라져도 결과가 완전히 달라진다.
예시 "안녕하세요"의 MD5 해시:8aa7bff6df7b5b66e749ce40eb295d7a
"안녕하세용"의 MD5 해시:완전히 다른 32자리 문자열
이 특성 덕분에 파일이 원본과 정확히 같은지 비교할 수 있다. 파일 내용이 1바이트라도 다르면 해시값이 완전히 달라지니까.
주요 해시 알고리즘 비교
| 알고리즘 | 출력 길이 | 보안성 | 용도 |
|---|---|---|---|
| MD5 | 128비트 (32자) | 취약 (충돌 발견됨) | 파일 식별용, 체크섬 |
| SHA-1 | 160비트 (40자) | 취약 (사용 중단 권고) | 레거시 시스템 |
| SHA-256 | 256비트 (64자) | 안전 | 보안 인증, 블록체인 |
| SHA-512 | 512비트 (128자) | 안전 | 높은 보안 요구 환경 |
주의 MD5와 SHA-1은 충돌 공격(서로 다른 두 입력이 같은 해시를 만드는 것)이 가능하다고 입증됐다. 보안 목적으로는 SHA-256 이상을 써야 한다. 단순히 파일이 같은지 빠르게 비교하는 용도로는 MD5도 여전히 쓸 만하다.
파일 무결성 검증하는 방법
- 배포자가 제공한 해시값을 복사해둔다 (보통 SHA-256)
- 다운받은 파일의 해시값을 생성한다
- 두 해시값을 비교해서 일치하면 변조되지 않은 원본이다
명령어로 확인하는 법
Windows에서는 명령 프롬프트에 아래 명령을 입력한다.
certutil -hashfile 파일명.zip SHA256
Mac/Linux에서는 터미널에서 이렇게 한다.
sha256sum 파일명.zip
브라우저에서 확인하는 법
명령어가 익숙하지 않다면 해시 생성기에 파일을 끌어다 놓으면 MD5, SHA-1, SHA-256, SHA-512 해시가 한 번에 나온다. 비교 기능도 있어서 배포자의 해시값과 내 파일의 해시값을 붙여넣으면 일치 여부를 바로 알려준다. 파일이 서버로 전송되지 않고 브라우저 안에서 처리되니까 민감한 파일도 사용할 수 있다.
해시가 쓰이는 다른 곳
- 비밀번호 저장: 서비스가 비밀번호 원문 대신 해시값을 저장한다. 유출되어도 원래 비밀번호를 알 수 없다.
- 블록체인: 거래 데이터의 해시를 연결해서 변조를 방지한다. 비트코인이 SHA-256을 쓴다.
- 중복 파일 탐지: 파일명이 달라도 해시가 같으면 내용이 동일한 파일이다.
해시는 원리를 몰라도 쓸 수 있다. 다운받은 파일의 해시와 배포 페이지의 해시를 비교하는 습관 하나만으로도 악성코드 감염 위험을 줄일 수 있다.