인터넷에서 프로그램을 내려받았는데 배포 페이지에 SHA-256 해시값이 적혀 있다. 이걸 대체 어떻게 하라는 건지, 처음 보면 당황스럽다. 해시값은 파일이 위조되지 않았는지 확인하는 디지털 지문 같은 것이다.
해시값이란
어떤 데이터를 넣든 고정된 길이의 문자열로 바꿔주는 게 해시 함수다. 같은 입력에는 항상 같은 결과가 나오고, 입력이 1글자만 달라져도 결과가 완전히 바뀐다. 원본 데이터에서 해시값을 만들 수는 있지만, 해시값에서 원본을 역추적하는 건 불가능하다.
예시 "안녕하세요"의 MD5 해시값은 b1a07e38a7e2fdd2ef5a0f64180e3832다. 여기서 한 글자라도 바꾸면 완전히 다른 값이 나온다.
MD5와 SHA-256, 뭐가 다른가
| 알고리즘 | 출력 길이 | 보안 강도 | 용도 |
|---|---|---|---|
| MD5 | 128비트 | 낮음 (충돌 취약) | 파일 체크섬, 빠른 검증 |
| SHA-1 | 160비트 | 보통 | Git 커밋 해시 |
| SHA-256 | 256비트 | 높음 | SSL 인증서, 비트코인 |
| SHA-384 | 384비트 | 매우 높음 | 금융, 정부 시스템 |
| SHA-512 | 512비트 | 최상 | 대용량 파일 검증 |
MD5는 속도가 빠르지만 같은 해시값을 만들어내는 충돌 공격이 가능해서 보안 용도로는 쓰지 않는다. 파일이 깨졌는지 정도만 확인하려면 MD5로 충분하고, 위변조 여부가 중요하면 SHA-256 이상을 쓰는 게 안전하다.
파일 해시값 확인하는 법
윈도우 명령 프롬프트에서도 해시값을 확인할 수 있다.
certutil -hashfile 파일명.zip SHA256
다만 여러 알고리즘을 동시에 비교하거나, 두 해시값이 일치하는지 검증하려면 명령어를 반복해야 한다. 브라우저에서 바로 처리하는 쪽이 빠를 때가 많은데, 온라인 해시 생성기는 파일을 드래그 앤 드롭으로 올리면 MD5부터 SHA-512까지 5개 해시값이 한 번에 나온다. 해시 비교 기능도 있어서 배포 페이지에 적힌 값과 내 파일의 값을 바로 대조할 수 있다.
이런 상황에서 해시값을 확인한다
- 오픈소스 프로그램을 내려받은 뒤 공식 배포 해시와 비교
- 외장 하드에 백업한 파일이 손상 없이 복사됐는지 검증
- 이메일로 받은 첨부 파일이 전송 중 변조되지 않았는지 확인
파일이 서버로 전송되지 않고 브라우저 안에서만 처리되기 때문에 민감한 문서를 올려도 유출 위험이 없다.
같은 파일인데 해시값이 다르게 나올 수 있나?
파일 내용이 1비트라도 다르면 해시값이 완전히 달라진다. 이름만 같고 내용이 다른 파일이거나, 전송 중 데이터가 손상된 경우에 해당한다.
MD5로 비밀번호를 저장해도 되나?
안 된다. MD5는 충돌 취약점이 알려져 있고, 레인보우 테이블 공격으로 원문을 추측할 수 있다. 비밀번호 저장에는 bcrypt나 Argon2 같은 전용 해시 함수를 써야 한다.
다운로드한 파일을 그냥 실행하기 전에 해시값 한 번만 대조하면 된다. 30초면 끝나는 일이 악성코드 감염을 막아준다.