해시값은 파일이나 문서의 내용을 정해진 길이의 값으로 나타낸 데이터의 지문이다. 한 글자만 바뀌어도 값이 달라진다(KCBCA Signals p.13). 그래서 내려받은 파일이 공식 배포본과 같은지, 검토한 코드가 실제 서비스에서 돌고 있는지, 받은 보고서가 발행 뒤에 바뀌지 않았는지 확인할 때 쓴다.

다만 해시값으로 확인되는 것은 바이트가 같다는 사실까지다. 문서 내용이 참인지, 해석이 옳은지, 누가 만들었는지는 따로 확인해야 한다(p.14, p.31). 운영체제 기본 명령으로 값을 직접 비교하는 법과 확인한 뒤에도 남는 한계를 정리한다.

해시값의 의미와 확인 방법, 증명의 한계
출처: KCBCA Global

해시값 뜻: 한 글자만 달라도 지문이 바뀐다

해시 함수는 문서를 정해진 길이의 고유한 값으로 바꾼다.

문서의 아주 작은 부분만 바뀌어도 값이 달라진다(p.13). 반대로 파일 이름이나 확장자만 바꿨다면 내용이 같으므로 값도 그대로다(Microsoft Learn). 한 글자만 다른 두 문장의 SHA-256 값이다.

한 글자 차이, 완전히 다른 값 송금 승인 금액: 100만 원 → 04b50f7c2d08d547… 송금 승인 금액: 900만 원 → 83566d6fbe9d68d1…

MD5와 SHA-1은 이제 공격에 안전하지 않은 방식으로 본다. 위변조를 확인할 때는 SHA-256 이상을 쓴다(Microsoft Learn).

해시값 확인 방법: 기본 명령이면 충분하다

환경입력할 명령참고
Windows PowerShellGet-FileHash 파일경로기본 SHA-256
Windows 명령 프롬프트certutil -hashfile 파일경로 SHA256알고리즘 지정
macOS 터미널shasum -a 256 파일경로-a 256 꼭 입력

나온 값을 배포처가 공식 경로에 공개한 값과 처음부터 끝까지 대조한다. 영문 대소문자 차이는 같은 값으로 본다. 한 글자라도 다르면 공식 배포본과 다른 파일이니 실행하지 말고 다시 받는다.

배포 검증: '성공' 표시 뒤에 남은 예전 코드

KCBCA Signals에 실린 실제 사례다. 배포는 성공으로 표시됐지만 서비스는 예전 코드로 돌아가고 있었다.

예전 소프트웨어 이미지에 새 버전 태그가 붙었고 서버도 정상으로 응답했다. 검토한 코드가 실제로 서비스되는지는 확인하지 못한 상태였다(p.30).

배포 검증: '성공' 표시 뒤에 남은 예전 코드
출처: KCBCA Global

그 뒤로는 새 태그와 정상 응답을 증거로 보지 않는다. 빌드한 이미지, 배포한 이미지, 실행 중인 작업, 앱이 보고하는 버전을 서로 대조하고, 하나라도 어긋나면 검증되지 않은 배포로 본다(p.31). 이미지의 해시값(다이제스트)은 같은 이미지인지 가리는 기준이다.

배포 검증: '성공' 표시 뒤에 남은 예전 코드
출처: KCBCA Global

보증 문서: 원본은 비공개, 지문만 기록한다

보안 점검 보고서처럼 민감한 원본은 암호화해 접근을 통제하고, 독립된 원장에는 지문만 기록하자는 제안이 있다. 나중에 문서를 받은 사람은 값을 다시 계산해 기록된 값과 맞는지 확인한다(p.13).

같은 파일 이름으로 다른 보고서를 올려도 값이 맞지 않는다(p.14). 원장과 블록체인의 쓰임은 10월 29일 '블록체인 보안' 글에서 자세히 다룬다.

해시가 증명하지 못하는 것 3가지

① 문서의 진실성과 작성자 조작된 문서라도 기록되면 기록 뒤 그대로였다는 것만 증명된다.

나쁜 증거도 좋은 증거만큼 '무결하게' 증명되는 셈이다(p.15). 누가 만들었는지 확인하려면 전자서명이 필요하다(p.14).

② 해석이 맞는지 암호학적 지문은 바이트가 같다는 것을 확인할 뿐, 그 자료를 읽은 해석이 옳다는 것은 확인하지 않는다. 그래서 해석은 원본에 연결해 두고, 나중에 바뀐 부분은 구분해 남긴다(p.31).

③ 결정이 옳았는지 블록체인은 공유 기록을 바꾸기 어렵게 할 수 있지만, 바깥에서 들어온 입력이 사실인지, 행동이 승인됐는지는 그것만으로 증명하지 못한다. 잘못된 결정은 오래 기록해도 잘못된 결정이다(p.31).

해시가 증명하지 못하는 것 3가지
출처: KCBCA Global

확인 결과를 읽는 체크 표

상황해시로 확인되는 것따로 확인할 것
내려받은 파일공식 배포본과 같은 파일인지공식 값을 공식 경로에서 받았는지
배포된 코드같은 이미지인지빌드·배포·실행·보고 버전 대조(p.30–31)
보고서·증거기록 뒤 바뀌지 않았는지내용이 참인지, 누가 발행했는지(p.14–15)
분석·결정 기록기록이 그대로인지해석과 결정이 옳은지(p.31)

자주 묻는 질문

Q. 해시값이 같으면 안전한 파일인가?

아니다.

값이 같다는 것은 두 파일의 내용이 같다는 뜻이다(Microsoft Learn). 공식 배포본과 같은 파일임을 확인할 뿐, 파일 자체에 문제가 없다는 보증은 아니다. 배포처를 믿을 수 있는지는 따로 판단해야 한다.

Q. 해시와 암호화는 다른가?

다르다. 암호화는 열쇠가 있는 사람만 내용을 읽도록 숨기는 일이고, 해시는 비교할 지문을 만드는 일이다.

지문에서 원래 문서를 되살리는 용도가 아니다. 원본은 암호화하고 지문만 기록하는 식으로 함께 쓴다(p.13).

Q. 블록체인에 올리면 진짜가 되는가?

아니다. 기록 뒤 문서가 바뀌지 않았다는 것은 보여 주지만, 내용이 사실이라는 것은 확립하지 않는다(p.15). 10월 29일 '블록체인 보안' 글에서 이어서 다룬다.


한눈에 정리

  • 해시값은 데이터의 지문, 한 글자만 바뀌어도 달라진다(p.13)
  • Get-FileHash·certutil·shasum으로 구해 공식 값과 대조한다
  • 배포는 빌드·배포·실행·보고 버전을 함께 대조한다(p.30–31)
  • 바이트가 같다는 것과 내용·해석이 맞다는 것은 별개다(p.15, p.31)

해시와 증명을 더 깊이 읽고 싶다면 KCBCA Signals 보고서를 확인해 본다.

KCBCA Signals Vol.1 Issue 1 원문 읽기

참고: KCBCA Signals Vol.1 Issue 1 Anthony Green(Greenhat Assurance 매니징 파트너, KCBCA GLOBAL 이사) p.13–15 Ted Kim(Shorti CEO) p.30–31 명령어: Microsoft Learn(Get-FileHash, certutil), shasum 설명서