파일 시그니처 (File Signature)
09 Apr 2023 |
이제는 모두가 아는 게임인 리그 오브 레전드, 롤(LoL)이라는 게임에서 프로선수들은 경기에서 각 팀명을 아이디 앞에 붙입니다.
마침 글을 쓰는 지금, 2023 LCK 스프링 결승전 중이네요.
이번 결승에는 T1과 젠지가 진출했군요. T1 팬이지만 (정확히는 페이커 선수) 젠지도 엄청난 팀임에는 분명합니다.
영혼의 맞다이 중인 페이커와 쵸비 선수
이렇게 다른 사람들이 볼 수 있는 곳에 자신의 소속을 명확하게 표시함으로써 정체성을 나타낼 수 있습니다. 예로부터 국가의 국기(國旗)나 군대의 부대마크 등 소속을 밖으로 드러내는 경우는 쉽게 찾아볼 수 있습니다.
파일 확장자 (File Extension)
파일의 경우 자신이 어떤 파일인지 어떻게 표시할 수 있을까요?
많은 분들이 예상하셨다시피 가장 널리 알려진 것은 확장자입니다. .txt
, .py
, .csv
등 우리에게 익숙한 파일 확장자들이 많습니다.
대부분의 운영체제 및 어플리케이션에는 확장자를 파일 형식 판별의 제 1 요소로 사용합니다. 예를 들면 윈도우에서 그림 파일(.jpg
등)의 확장자를 텍스트 파일(.txt
)로 변경하면 파일의 아이콘이 바로 변경되는 것을 볼 수 있습니다.
하지만, 이런 파일 확장자는 외부로 노출 되는 것이기 때문에 쉽게 변경할 수 있어서 무조건 신뢰할 수는 없습니다. 누군가가 실수로, 혹은 악의적으로 확장자를 바꿔놓을 수 있으니까요
파일 시그니처 (File Signature)
파일 시그니처(File Signature)는 파일 형식마다 정해진 고유한 바이트 시퀀스입니다.
이번 글을 쓰게 된 계기가 된 파케이 파일 형식의 정의를 살펴 볼까요?
맨 앞과 맨 뒤에 Magic Number (4 bytes): "PAR1"
이라고 적혀 있습니다.
이 부분이 파케이 파일의 파일 시그니처 입니다. 파케이 파일은 맨 앞과 맨 뒤의 4 바이트는 PAR1
로 되어 있다는 뜻입니다.
실제로 파케이 파일을 읽어보면 맨 앞과 맨 뒤의 4 바이트는 PAR1
로 되어 있습니다.
>>> d = open('./data.parquet', 'rb').read()
>>> d[:4]
b'PAR1'
>>> d[-4:]
b'PAR1'
매직 넘버 (Magic Number)
위의 예시에서 매직 넘버라는 단어가 등장합니다.
매직 넘버는 예전에 Unix, Linux 등에서 파일 형식을 표시하기 위해서 2 바이트 정도의 숫자를 파일 헤더(Header)에 적어놓은 것으로부터 유래되었습니다. 현재는 범위가 확장되어서 꼭 2 바이트가 아니어도 파일의 형식을 나타내기 위해 미리 정해진 위치에 기재하는 특정 값을 뜻하게 되었습니다.
더 자세한 것은 위키피디아 참조.
파일 시그니처의 특징
1. 보통 파일의 시작 부분에 나타납니다.
파일 시그니처가 맨 앞에 나타나면 헤더(Header) 시그니처, 맨 뒤에 나타나면 푸터(Footer) 시그니처라고 합니다.
보통은 헤더 시그니처만 가집니다. 어찌보면 당연한 것이, 파일의 종류를 시작 부분에서 알게 되면 파일을 어떻게 처리할 지 처음부터 알 수 있기 때문입니다.
물론 파케이 형식처럼 맨 앞과 맨 뒤에 모두 나타날 수도 있고, 맨 뒤에만 나타날 수도 있습니다. 파일 형식을 그렇게 정의하면 그런 것이니까요
2. 통일된 규칙이나 법칙은 없습니다.
파일 형식이란 필요에 따라서 누구나 다 정의를 할 수 있기 때문에 통일된 규칙은 없습니다.
하지만, 상식선에서 많이 정의 되는 편입니다. 아스키 코드로 변환하면 파일 명이 들어가 있는 경우도 많습니다.
예를 들어서 비트맵(bitmap) 파일의 시그니처는 42 4D
이지만 아스키 코드로 BM
, PNG 파일은 89 50 4E 47 0D 0A 1A 0A
이지만, 텍스트로 ‰PNG␍␊␚␊
입니다.
zip 파일 중에 대부분은 50 4B 03 04
를 시그니처로 가지는데, 아스키 코드로 변환하면 PK♥♦
입니다. 여기에서 PK
는 DOS 압축 유틸리티의 개발자인 Phil Katz
라고 하네요
3. 파일 시그니처도 변조될 수 있습니다.
확장자와 마찬가지로 파일 시그니처가 변경된 경우 해당 파일이 변조될 수 있으며, 이는 보안 상 큰 문제 등으로 이어질 수 있습니다.
실제로, 2019년에 PNG 파일 시그니처를 사용하여 PNG 파일인 것처럼 위장한 바이러스가 등장한 적이 있습니다. (기사 링크)
이런 경우 파일 정합성 검사, 해싱 값 비교 등 다양한 방법이 사용될 수 있습니다.
이 내용은 어느 카테고리에 들어가야 하는지 고민했으나, 데이터 엔지니어링을 공부하다 알게 된 내용이므로 데이터 엔지니어링으로
데이터를 더 잘 이해하게 된 것이니까 엔지니어링이 맞을수도?