유틸리티

해시값이란? MD5, SHA-256 차이와 파일 무결성 검증법

오픈소스 프로그램을 다운로드하면 옆에 SHA-256 체크섬이 적혀 있는 걸 본 적이 있을 것이다. 대부분 무시하고 지나치지만, 이 값을 비교하는 것만으로 파일이 중간에 변조되지 않았는지 확인할 수 있다.

해시값은 무엇인가

해시 함수에 데이터를 넣으면 고정된 길이의 문자열이 나온다. 원본 데이터가 1바이트든 1기가바이트든 결과의 길이는 동일하다. 입력이 1비트만 달라져도 해시값이 완전히 바뀌기 때문에, 두 파일의 해시값이 같으면 내용도 같다고 판단할 수 있다.

예시 "hello"의 MD5 해시: 5d41402abc4b2a76b9719d911017c592
"hello."의 MD5 해시: 2a5a05980e2ffe2f27ddb98ad0674563
마침표 하나 추가했을 뿐인데 결과가 완전히 다르다.

알고리즘별 차이

알고리즘출력 길이보안 수준주 용도
MD5128비트 (32자)취약파일 동일성 빠른 비교
SHA-1160비트 (40자)취약Git 커밋 식별
SHA-256256비트 (64자)강함SSL 인증서, 블록체인
SHA-512512비트 (128자)매우 강함고보안 환경

MD5는 충돌(서로 다른 입력이 같은 해시를 만드는 것)이 발견된 지 오래라 보안 용도로는 부적합하다. 파일 체크섬 용도로는 아직 쓰이지만, 보안이 중요한 곳에서는 SHA-256 이상을 사용한다.

파일 무결성 검증 실전

소프트웨어 배포 사이트에서 파일을 받았다면 다음 순서로 확인한다.

  1. 배포 사이트에 적힌 해시값(보통 SHA-256)을 복사한다
  2. 다운로드한 파일의 해시값을 생성한다
  3. 두 값을 비교해서 일치하면 파일이 원본과 동일하다고 판단한다

파일을 서버에 올리지 않고 브라우저에서 바로 해시값을 뽑을 수 있는 곳도 있다. 해시 생성기에 파일을 드래그해서 놓으면 MD5, SHA-1, SHA-256, SHA-512를 동시에 생성해주고, 두 해시값을 붙여넣어 비교하는 기능도 있어서 수동으로 눈대중 비교할 필요가 없다.

주의 해시는 단방향 함수라서 해시값으로 원본 데이터를 복원할 수 없다. 비밀번호를 해시로 저장하는 이유도 이 때문이다. 다만 MD5는 레인보우 테이블 공격에 취약하므로 비밀번호 저장에는 bcrypt 같은 전용 알고리즘을 쓰는 게 맞다.