Сигнатура файла: что это такое, зачем она нужна и как её использовать

Сигнатура файла — это характерная последовательность байтов в начале файла, по которой программы определяют его действительный формат. Она не зависит от имени или расширения: даже если переименовать картинку в документ, сигнатура останется прежней, и именно она подскажет, чем файл является на самом деле. В этой статье разберёмся, как устроены сигнатуры, почему их называют «магическими числами», как посмотреть сигнатуру самостоятельно и в каких практических ситуациях это действительно нужно.

Простыми словами: что скрывается за термином

Любой файл на диске — это просто последовательность байтов. Операционная система обычно ориентируется на расширение в имени: «.jpg», «.pdf», «.exe». Но расширение — лишь часть названия, которую легко изменить. Программам, особенно тем, что обрабатывают данные из интернета, нужна более надёжная метка.

Такой меткой и служит сигнатура. Многие форматы начинаются с фиксированного набора байтов, который разработчики стандарта записали в спецификацию. Например, у файлов PNG первые восемь байтов всегда одинаковы, а у ZIP-архивов первые два байта — символы «PK». Эти значения иногда называют «магическими числами» (magic numbers): исторический термин из мира Unix, где первые байты файла использовались для автоматического определения типа.

Важный нюанс: сигнатура — это не отдельное поле «внутри» файла, которое можно найти поиском по тексту. Это буквально первые байты содержимого, записанные в двоичном виде. Поэтому для работы с ними нужны инструменты, умеющие показывать шестнадцатеричное представление данных.

Зачем нужна проверка сигнатуры на практике

Определение формата по содержимому, а не по имени, решает несколько реальных задач:

  • Безопасность. Злоумышленники нередко маскируют исполняемый файл или скрипт под безобидный документ, меняя расширение. Почтовые фильтры и антивирусы сверяют сигнатуру с заявленным типом, чтобы отсечь такие подделки.
  • Восстановление данных. Программы восстановления удалённых файлов часто ищут на диске не записи файловой системы, а именно сигнатуры известных форматов. Этот подход называют «carving» — «вырезание» файлов по характерным байтам.
  • Диагностика повреждений. Если файл не открывается, проверка первых байтов помогает понять, действительно ли это тот формат, который ожидается, или содержимое повреждено либо заменено.
  • Проверка загрузок. Серверы, принимающие файлы от пользователей, обязаны проверять фактический тип содержимого: доверять расширению нельзя, потому что его задаёт сам пользователь.
  • Работа со старыми или безымянными данными. Файлы, потерявшие имя при переносе с носителя или пришедшие из резервной копии, опознаются по содержимому.

Как выглядят типичные сигнатуры

Сигнатуры принято записывать в шестнадцатеричной системе, поскольку двоичные данные неудобно читать напрямую. Ниже — несколько широко известных примеров; точные значения зафиксированы в спецификациях соответствующих форматов и устойчивы годами.

Формат Сигнатура (hex) Комментарий
PNG 89 50 4E 47 0D 0A 1A 0A Начинается с байта 89, затем ASCII-символы «PNG»
JPEG FF D8 FF Три байта, дальше идут данные изображения
GIF 47 49 46 38 ASCII-строка «GIF8», далее версия («7a» или «9a»)
PDF 25 50 44 46 Строка «%PDF» в начале файла
ZIP 50 4B 03 04 Символы «PK»; так же начинается DOCX, XLSX, APK
RAR 52 61 72 21 Строка «Rar!»
EXE (Windows) 4D 5A Символы «MZ» — инициалы одного из создателей формата
MP3 (ID3) 49 44 33 Строка «ID3» — тег в начале файла; без тега MP3 может начинаться иначе

Обратите внимание на строку про ZIP: современные офисные документы Word, Excel и PowerPoint — это тоже ZIP-архивы внутри, поэтому их сигнатура совпадает. Чтобы различить их между собой, программа смотрит глубже — на служебные файлы внутри архива. Это хороший пример того, что сигнатура отвечает на вопрос «какой это контейнер», но не всегда даёт полную картину.

Ограничения: когда сигнатура не даёт полного ответа

Полагаться только на первые байты было бы ошибкой. У подхода есть известные слабые места:

  • Совпадающие контейнеры. Как показано выше, ZIP объединяет десятки форматов. Аналогично многие медиаконтейнеры (например, MPEG-4) вмещают видео, аудио и субтитры разных кодеков.
  • Отсутствие сигнатуры. Часть текстовых форматов — CSV, обычные TXT, HTML без служебных заголовков — не имеет фиксированных начальных байтов. Их тип определяется эвристически, по структуре содержимого.
  • Смещённые заголовки. Некоторые форматы допускают служебные данные перед основной сигнатурой, поэтому строгие проверки «только первые N байтов» могут дать ложный отрицательный результат.
  • Подделка сигнатуры. Первые байты так же легко записать вручную, как и сменить расширение. Совпадение сигнатуры повышает доверие к файлу, но не гарантирует безопасность: полноценную проверку выполняет антивирус и песочница.
  • Повреждение начала файла. Если испорчены именно первые килобайты, сигнатура будет нечитаемой, хотя остальная часть данных может быть целой.

Как посмотреть сигнатуру файла самостоятельно

Для разовой проверки достаточно любого инструмента, показывающего файл в шестнадцатеричном виде. Порядок действий универсален:

  1. Откройте файл в hex-редакторе или просмотрщике. На Windows популярны бесплатные hex-редакторы и встроенная утилита certutil -encodehex; в Linux и macOS есть команда xxd имя_файла | head.
  2. Посмотрите первые 8–16 байтов. Для большинства распространённых форматов этого достаточно.
  3. Сравните полученную последовательность с таблицей сигнатур нужного формата. Значения берите из официальной спецификации или поддерживаемых открытых справочников магических чисел.
  4. Если первые байты не совпадают с ожидаемыми — файл либо другого формата, либо повреждён, либо имеет смещённый заголовок.

Ещё проще воспользоваться готовыми командами определения типа. В Linux и macOS команда file имя_файла сама читает сигнатуру и выводит предполагаемый формат. В Windows аналогичную задачу решают сторонние утилиты, а также некоторые файловые менеджеры, показывающие реальный тип содержимого.

Сигнатура и расширение: кто главнее

Расширение и сигнатура отвечают на разные вопросы. Расширение — это заявление автора файла о том, чем он должен быть. Сигнатура — фактическое свидетельство того, что внутри. Когда они расходятся, верить следует содержимому.

На практике расхождение возникает в трёх типичных ситуациях:

  • файл просто неправильно назван при сохранении или пересылке — тогда достаточно вернуть корректное расширение;
  • файл маскируется намеренно — здесь важна осторожность: не запускайте содержимое, пока не убедитесь в его природе;
  • формат был определён неверно изначально, например экспорт из программы сохранил данные в другом виде, чем обещал интерфейс.

Если вы получили файл из ненадёжного источника и его сигнатура указывает на исполняемый формат или скрипт, хотя ожидался документ, — открывать такой файл не стоит до проверки антивирусом.

Где ещё применяются сигнатуры

Судебная экспертиза и анализ инцидентов

Специалисты компьютерной форензики используют сигнатуры для поиска скрытых и удалённых данных: фрагменты файлов находят на диске и в образах памяти по характерным байтам, даже если файловая система о них уже ничего не знает.

Разработка и веб-сервисы

При приёме загрузок от пользователей серверная логика обычно сверяет три вещи: расширение, MIME-тип из HTTP-заголовка и фактическую сигнатуру. Первые два параметра контролирует клиент, поэтому решающим остаётся третий. Библиотеки определения типов по содержимому есть практически для всех популярных языков программирования.

Архивация и дедупликация

Системы резервного копирования классифицируют данные по типам, чтобы применять подходящие методы обработки: изображения сжимают одними алгоритмами, базы данных — другими. Автоматическое распознавание по сигнатуре избавляет от ошибок классификации.

Частые вопросы

Можно ли изменить сигнатуру файла?

Да, технически это те же байты, и их можно перезаписать. Но после этого файл перестанет соответствовать своему формату: программы либо откажутся его открывать, либо обработают некорректно. Подмена сигнатуры используется разве что для обхода примитивных фильтров, а не для реального преобразования формата.

Чем сигнатура отличается от хеша файла?

Это разные понятия. Хеш вычисляется по всему содержимому и уникален для конкретного файла: два одинаковых документа имеют одинаковый хеш. Сигнатура же одинакова у всех файлов одного формата и занимает лишь несколько байтов в начале. Хеш используют для проверки целостности и поиска дубликатов, сигнатуру — для определения типа.

Почему у некоторых файлов нет сигнатуры?

Потому что стандарт формата её не предусматривает. Текстовые форматы исторически развивались так, чтобы быть читаемыми «как есть», и фиксированный двоичный заголовок им был не нужен. Для таких файлов тип определяется по анализу структуры: наличию разделителей, тегов, ключевых слов.

Достаточно ли проверки сигнатуры, чтобы безопасно открыть файл?

Нет. Совпадение сигнатуры говорит лишь о том, что начало файла похоже на заявленный формат. Вредоносный код может находиться дальше по содержимому, а сама сигнатура может быть подделана. Для файлов из непроверенных источников используйте актуальный антивирус и не запускайте исполняемые элементы без необходимости.

Что запомнить и что делать дальше

Главный принцип: тип файла определяется по содержимому, а не по имени. Расширение — удобная подсказка, но единственным надёжным источником правды являются сами данные, начиная с первых байтов.

Если перед вами стоит конкретная задача, действуйте так:

  • файл не открывается — посмотрите его первые байты в hex-просмотрщике и сравните с сигнатурой ожидаемого формата;
  • получили вложение из сомнительного источника — сверьте сигнатуру с расширением и при расхождении проверьте файл антивирусом;
  • разрабатываете приём загрузок — добавьте проверку содержимого на сервере, не полагаясь на MIME-тип клиента;
  • ищете потерянные данные — используйте утилиты восстановления, работающие по сигнатурам нужных вам форматов.

Для углубления полезно держать под рукой открытый справочник магических чисел и спецификацию интересующего формата: значения там зафиксированы официально, и именно им стоит доверять при спорных случаях.

PEFile.ru