• Если вам не нравится слово отпечаток, заменяйте его на слово hash.

  • В статье фигурируют два отпечатка: отпечаток (hash) публичного ключа и отпечаток (hash) файла с данными. Будьте внимательны, чтобы понимать, о каком отпечатке мы говорим в данный момент.

Предположим, что у нас есть:

file_name — файл данных, подлинность которого мы хотим проверить.

file_name.asc — файл с цифровой подписью, который содержит:

  1. Зашифрованный отпечаток файла file_name, где для шифрования используется секретный (!) ключ создателя файла с данными.

  2. Отпечаток публичного ключа. Это может быть (a) SHA-256 сумма публичного ключа в шестнадцатеричном представлении (64 символа) (b) SHA-1 сумма публичного ключа в шестнадцатеричном представлении (40 символов) (c) урезанные отпечатки из (а) или (b) (из соображений безопасности больше не используются).

Принцип работы алгоритма довольно простой: мы каким-то образом получаем отпечаток публичного ключа. Предполагается, что мы на 100500% уверены в подлинности этого отпечатка (мы вернёмся к вопросу уверенности в конце статьи). По этому отпечатку ключа мы загружаем сам публичный ключ. Теперь у нас есть два способа вычислить отпечаток файла file_name: прямым вычислением (например, sha256sum file_name) и расшифровав с помощью открытого ключа зашифрованный отпечаток из файла file_name.asc. Если они совпали, значит файл file_name с оглушительно высокой вероятностью подлинный. Эти шаги нам не нужно проделывать самим, за нас это делает программа gpg.

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

Armbian_25.8.1_Nanopim4v2_bookworm_current_6.12.41_minimal.img.xz

и файл цифровой подписи

Armbian_25.8.1_Nanopim4v2_bookworm_current_6.12.41_minimal.img.xz.asc

Теперь попробуем проверить, что мы загрузили подлинный файл прошивки

$ gpg --verify Armbian_25.8.1_Nanopim4v2_bookworm_current_6.12.41_minimal.img.xz.asc gpg: assuming signed data in 'Armbian_25.8.1_Nanopim4v2_bookworm_current_6.12.41_minimal.img.xz'
gpg: Signature made Mon 11 Aug 2025 06:39:54 PM MSK
gpg: using RSA key DF00FAF1C577104B50BF1D0093D6889F9F0E78D5
gpg: Can't check signature: No public key

Когда мы вызываем команду gpg --verify, выполняются 3 операции:

  1. GPG читает отпечаток публичного ключа из файла asc. Как мы видим, публичный ключ должен иметь отпечаток DF00FAF1C577104B50BF1D0093D6889F9F0E78D5. Он имеет длину 40 символов, что говорит нам, что это SHA-1 сумма публичного ключа.

  2. Ищет публичный ключ с таким отпечатком в базе данных GPG на нашем компьютере. Сообщение gpg: Can't check signature: No public key говорит нам, что у нас нет публичного ключа с таким отпечатком.

  3. Использует найденный публичный ключ для проверки подписи. Эта операция не выполнилась, потому что упомянутый отпечаток не был найден.

Таким образом, чтобы все операции были выполнены, нам нужно откуда-то загрузить публичный ключ. Команда ниже ищет публичный ключ по отпечатку в базе ключей компании Ubuntu и сохраняет его в базе данных программы GPG на нашем компьютере

$ gpg --keyserver hkp://keyserver.ubuntu.com --recv-key DF00FAF1C577104B50BF1D0093D6889F9F0E78D5
gpg: key 93D6889F9F0E78D5: 1 duplicate signature removed
gpg: key 93D6889F9F0E78D5: public key "Igor Pecovnik <
igor@armbian.com>" imported
gpg: Total number processed: 1
gpg: imported: 1

Теперь мы готовы снова вызвать команду gpg --verify:

$ gpg --verify Armbian_25.8.1_Nanopim4v2_bookworm_current_6.12.41_minimal.img.xz.asc
gpg: assuming signed data in 'Armbian_25.8.1_Nanopim4v2_bookworm_current_6.12.41_minimal.img.xz'
gpg: Signature made Mon 11 Aug 2025 06:39:54 PM MSK
gpg: using RSA key DF00FAF1C577104B50BF1D0093D6889F9F0E78D5
gpg: Good signature from "Igor Pecovnik <
igor@armbian.com>" [unknown]
gpg: aka "Igor Pecovnik (Ljubljana, Slovenia) <
igor.pecovnik@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: DF00 FAF1 C577 104B 50BF 1D00 93D6 889F 9F0E 78D5

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

Родное сердце, я без понятия, кто подгрузил ключ с отпечатком DF00FAF1C577104B50BF1D0093D6889F9F0E78D5 в мою базу данных. Может это был ты. А может, пока тебя не было, к компьютеру подошёл твой лучший друг и залил тебе какой-то левый ключ. Ах, да, ты ведь скачал его с сервера ключей компании Ubuntu, но знаешь... туда ведь может загружать ключи любой клоун. Не знал? Можешь сам назваться Биллом Гейтсом или Ларисой Долиной и загрузить туда свой ключ, а потом посмотреть, откроет ли он твою квартиру. Там нихрена нет ни модерации, ни какой-то проверки личности. В общем я хз, что за ключ ты мне скормил. Я могу сказать тебе только одно: не важно из какой мусорки ты загрузил свой файл, и даже не важно из какой мусорки ты загрузил asc-файл с цифровой подписью, пусть даже ты загрузил их с самого поносн��го сайта хакеров, но... если ты уверен, что отпечаток DF00FAF1C577104B50BF1D0093D6889F9F0E78D5 — это отпечаток ключа настоящего владельца, то я гарантирую, что загруженный в мою базу данных публичный ключ — настоящий, а твой файл с данными создал именно владелец этого ключа, а не какой-то левый чел, и никакая судья Перепелкова не признает это право собственности недействительным.

И это на самом деле очень сильное утверждение. Вы могли получить и файл с данными, и asc-файл от злоумышленников. Но криптографические алгоритмы всё равно гарантируют, что

  1. злоумышленникам не удастся создать свой собственный ключ с таким же отпечатком (то есть не удастся подменить публичный ключ) и

  2. не удастся изменить файл с данными и asc-файл так, чтобы они прошли проверку с помощью настоящего ключа (а его они не могут подменить согласно пункту 1).

Как мы же можем проверить, что отпечаток настоящий? Можно, например, зайти на сайт Armbian, где он выложен. Однако остаётся критическая проблема безопасности: если кто-то взломал сайт Armbian и заменил отпечаток ключа на свой собственный. И тут единственное решение — это найти несколько независимых источников (GitHub Armbian, документацию, форумы, сторонние сайты), которые подтверждают, что подлинный публичный ключ Armbian имеет именно такой отпечаток. Но кто из нас настолько помешан на безопасности, что будет осуществлять такие проверки, правда?