컴퓨터로 작업을 하다보면 파일 포맷을 먼저 확인하고, 그에 맞게 처리해야 할 때가 있다.
예를 들어, 이미지 포맷들 중 JPEG와 GIF를 구분하여 다르게 처리해야하는 경우, JPEG는 정적 단일 이미지로 렌더링 하고 GIF는 이미지 스트림을 지원하므로 소위 말하는 움짤로 구현해야 하는 경우가 있다.
그렇다면 파일 포맷이 JPEG 또는 GIF인지 어떻게 확인하면 좋을까?
가장 간단한 방법은 파일 이름의 확장자로 구분하는 것이다. 일반적인 경우 문제가 없지만 만약 사용자가 임의로 파일의 확장자를 변경하는 경우, 의도하지 않은 결과를 낳게 된다. 왜냐하면 확장자를 변경한다고 해서 파일 포맷이 변경되는 것은 아니기 때문이다.
JPEG 포맷인 파일인 imge.jpeg를 확장자만 gif로 한 image.gif로 바꿔도 여전히 파일은 JPEG 포맷이다.
여기서 말하는 파일 포맷은 저장을 목적으로 정보를 컴퓨터 파일로 인코딩하는 특별한 방식을 뜻한다.
바로 이 파일 포맷안에 파일 시그니처라는 게 존재한다.
파일 시그니처란?
파일 시그니처는 파일 시작 부분에 표시되는 고유 식별 번호이다.
예를들어 JPEG 파일은 다음과 같이 "FF D8 FF E0"의 시그니처를 갖는다. 즉 모든 JPEG형식의 파일의 포맷에는 이런식의 공통된 파일 시그니처를 갖게 된다.
위 설명처럼 파일의 처음에만 존재하는 파일 포맷도 있지만 파일의 마지막에도 존재하는 포맷도 있다. 파일의 처음에 존재하는 시그니처는 보통 헤더(Header)시그니처, 파일의 마지막에 존재하는 시그니처는 푸터(Footer or Tailer)시그니처라고 부른다. 그리고 문서에 따라 시그니처를 매직 넘버(magic number)라고 사용하는 경우도 있다.
Header 시그니처와 Footer 시그니처가 동시에 존재하는 경우도 있다.
대표적인 예로 PNG 형식의 파일이 그러하다.
PNG 형식의 Header 시그니처는 89 50 4E 47 0D 0A 1A 0A 이고 Footer 시그니처는 49 45 4E 44 AE 42 60 82 이다.
파일 포맷 앞 부분
파일 포맷 뒷 부분
앞 부분의 시그니처와 뒤 부분의 시그니처 모두 PNG 시그니처와 동일하다.
이렇게 파일 시그니처는 파일 유형을 알려주고 포함된 데이터에 대한 정보도 제공한다. 컴퓨터는 그것을 읽는 방법이나 그것을 여는 데 사용할 응용 프로그램을 결정하는 데 사용한다. 사용자가 잘못된 확장자를 사용하여 파일을 저장하면 컴퓨터에서 파일을 열 수 없다는 오류 메시지가 표시된다.
파일시그니처는 파일 형식을 식별하는 역할뿐만 아니라 파일 내의 데이터가 손상되지 않았는지 확인하기 위한 오류 검사에 사용될 수 있는 정보도 포함 될 수 있다. 이를 위해 일반적으로 체크섬이라는 함수가 사용된다. 체크섬은 파일 데이터의 정수값을 사용하여 파일을 전송하거나 로드한 후에도 동일한 수학적인 값을 생성할 수 있는 함수이다. 이 과정은 파일 내 일련의 바이트의 값을 더하고 합계를 기록하는 것으로 이루어진다. 이후 파일을 해석하는 프로그램은 동일한 함수를 실행하여 결과를 비교한다. 이 과정에서 결과가 다르다면 파일이 손상되었을 수 있고, 데이터는 유효하지 않거나 악의적으로 수정되었을 수 있다.
시그니처가 있는 파일
Header Signature(Hex)
1.GIF
47 49 46 38 37 61
47 49 46 38 39 61
2. PNG
89 50 4E 47 0D 0A 1A 0A
3. PDF
25 50 44 46 2D 31 2E
4. ZIP
50 4B 03 04
5. ALZ
41 4C 5A 01
6. MP4
00 00 00 18 66 74 79 70
f t y p
33 67 70 35
3 g p 5
6. HWP
D0 CF 11 E0 A1 B1 1A E1
7. DRW
00 FF 02 04 03 02
이외에도 수많은 파일형식에 시그니처가 존재한다.
[참고]
https://threat.media/definition/what-is-a-file-signature/
https://www.lsoft.net/posts/file-signatures/
'CS > cs' 카테고리의 다른 글
[CS] API 란? (1) | 2023.02.18 |
---|