오픈소스 프로그램을 다운로드하면 옆에 SHA-256 체크섬이 적혀 있는 걸 본 적이 있을 것이다. 대부분 무시하고 지나치지만, 이 값을 비교하는 것만으로 파일이 중간에 변조되지 않았는지 확인할 수 있다.
해시값은 무엇인가
해시 함수에 데이터를 넣으면 고정된 길이의 문자열이 나온다. 원본 데이터가 1바이트든 1기가바이트든 결과의 길이는 동일하다. 입력이 1비트만 달라져도 해시값이 완전히 바뀌기 때문에, 두 파일의 해시값이 같으면 내용도 같다고 판단할 수 있다.
예시 "hello"의 MD5 해시: 5d41402abc4b2a76b9719d911017c592
"hello."의 MD5 해시: 2a5a05980e2ffe2f27ddb98ad0674563
마침표 하나 추가했을 뿐인데 결과가 완전히 다르다.
알고리즘별 차이
| 알고리즘 | 출력 길이 | 보안 수준 | 주 용도 |
|---|---|---|---|
| MD5 | 128비트 (32자) | 취약 | 파일 동일성 빠른 비교 |
| SHA-1 | 160비트 (40자) | 취약 | Git 커밋 식별 |
| SHA-256 | 256비트 (64자) | 강함 | SSL 인증서, 블록체인 |
| SHA-512 | 512비트 (128자) | 매우 강함 | 고보안 환경 |
MD5는 충돌(서로 다른 입력이 같은 해시를 만드는 것)이 발견된 지 오래라 보안 용도로는 부적합하다. 파일 체크섬 용도로는 아직 쓰이지만, 보안이 중요한 곳에서는 SHA-256 이상을 사용한다.
파일 무결성 검증 실전
소프트웨어 배포 사이트에서 파일을 받았다면 다음 순서로 확인한다.
- 배포 사이트에 적힌 해시값(보통 SHA-256)을 복사한다
- 다운로드한 파일의 해시값을 생성한다
- 두 값을 비교해서 일치하면 파일이 원본과 동일하다고 판단한다
파일을 서버에 올리지 않고 브라우저에서 바로 해시값을 뽑을 수 있는 곳도 있다. 해시 생성기에 파일을 드래그해서 놓으면 MD5, SHA-1, SHA-256, SHA-512를 동시에 생성해주고, 두 해시값을 붙여넣어 비교하는 기능도 있어서 수동으로 눈대중 비교할 필요가 없다.
주의 해시는 단방향 함수라서 해시값으로 원본 데이터를 복원할 수 없다. 비밀번호를 해시로 저장하는 이유도 이 때문이다. 다만 MD5는 레인보우 테이블 공격에 취약하므로 비밀번호 저장에는 bcrypt 같은 전용 알고리즘을 쓰는 게 맞다.