친구가 일정.txt를 보내고 잠시 뒤 같은 이름의 파일을 한 번 더 보냈다고 해봅시다. “이거 수정본이야?”라고 묻고 싶은데, 이름만 보면 구분이 안 됩니다.

둘 다 같은 이름표를 달고 있으면, 이름표만 봐서는 누가 누군지 모르죠. 파일도 이름이 같다는 것과 내용이 같다는 것은 별개입니다.
이름은 그대로, 숫자 하나만 바꿔 보면
아래는 이름도 크기도 같은 두 개의 작은 텍스트 파일을 가정한 예시입니다. A는 3시, B는 4시입니다. 눈으로는 숫자 하나만 다릅니다.
가상 파일 · 미리 계산한 SHA-256
회의는 3시
UTF-8 · 14바이트51dc58ffc3951f9babb421700fc095824d05d3932b7a472aeeaf985e0729e69e회의는 4시
UTF-8 · 14바이트19441659987709183aa96cc2fd641232461900abe19a31c9c8a95df3567eee05해시가 다릅니다.
두 고정 문장만 브라우저 안에서 계산합니다. 실제 파일을 읽거나 업로드하지 않습니다. 줄바꿈·BOM 없는 UTF-8을 사용하며, 64자리 해시 전체를 표시했습니다. 버튼은 Web Crypto를 지원하는 보안 연결 환경에서 작동합니다.
B를 ‘같은 내용으로’ 바꾸면 두 해시가 같아집니다. 다시 한 글자를 다르게 하면 결과도 달라집니다. 파일명과 크기만 봤을 때는 없던 차이가 드러납니다.
내용에서 계산한 비교용 값, 해시
파일의 내용 데이터를 정해진 계산법에 넣어 얻는 값이 해시입니다. 여기서는 SHA-256이라는 계산법을 썼습니다. 길이가 다른 데이터를 넣어도 결과 길이는 정해져 있고, 같은 바이트를 같은 계산법에 넣으면 같은 결과가 나옵니다.[1]
위 예시의 해시는 파일 이름을 계산에 넣지 않았습니다. 내용 바이트는 그대로 두고 이름만 바꾸는 경우라면 결과도 그대로입니다. 반대로 파일을 열어 다시 저장하면서 내부 정보가 달라졌다면 내용 바이트를 그대로 둔 경우가 아닐 수 있습니다.

“같은 그림인데요.” 위에서 B를 A와 같은 문장으로 돌렸을 때도 그렇습니다. 이름이 같아서가 아니라, 실제로 같은 내용 바이트를 넣었기 때문에 같은 값이 나왔습니다.
다운로드가 원본과 같은지 확인할 때도
배포자가 파일과 함께 SHA-256 값을 제공하면, 받은 파일을 같은 방식으로 계산해 비교할 수 있습니다. 전달 중 내용이 바뀌었는지 확인하는 데 쓰는 겁니다.[2]
같은 알고리즘으로 계산했는데 값이 다르면 내용 바이트가 다릅니다. 다만 해시 값만으로 어느 부분이 바뀌었는지, 누가 왜 바꿨는지까지 알 수는 없습니다.
같은 해시라고 해서 수학적으로 모든 파일의 동일성을 절대 보장하는 것도 아닙니다. 서로 다른 입력에서 같은 결과가 나오는 경우를 충돌이라고 합니다. SHA-256은 그런 쌍을 찾기 어렵도록 설계된 해시이지만, ‘같은 값이면 어떤 경우에도 같은 파일’이라고 확대하면 안 됩니다.[3]
또 해시는 파일을 숨겼다가 되돌리는 암호화가 아니며, 악성 파일이 아니라는 인증서도 아닙니다. 비교 대상 값 역시 믿을 수 있는 배포처에서 확인해야 합니다.
오늘은 이름표 다음으로, 내용을 보기
- 파일 이름이나 크기가 같다는 이유만으로 같은 내용이라고 단정하지 않습니다.
- 제공된 해시와 비교할 때는 SHA-256처럼 계산법도 같은지 확인합니다.
- 해시 비교는 내용 확인의 한 도구입니다. 파일의 출처와 안전성 판단까지 맡기지는 않습니다.
파일 이름에 ‘진짜최종’을 한 번 더 붙여도 내용이 증명되지는 않습니다. 이름표가 헷갈릴 때는, 안에 든 것을 기준으로 비교해야 합니다.
[1] MDN — SubtleCrypto.digest() · NIST — Hash Functions
[2] NIST — Secure Hash Standard
[3] NIST — Collision · Cryptographic hash function
친구와 일정 파일은 가상 상황입니다. 원본 장면은 구별과 비교의 상황을 빗댄 것이며 실제 파일 검사 화면은 아닙니다.