Программа, которой вы создаёте ключ или подписываете транзакцию, — самая привлекательная мишень для подмены. Проверка подлинности отвечает на три разных вопроса, и каждый закрывается своим инструментом:
| Вопрос | Инструмент |
|---|---|
| Дошёл ли файл без изменений? | контрольная сумма (sha256sum) |
| Тот ли человек его выпустил? | подпись PGP |
| Соответствует ли бинарник исходникам? | воспроизводимая сборка |
Первые два разобраны в материале о проверке подписей, третий — в документации Bitcoin Core.
Немного терминологии
PGP (Pretty Good Privacy) — программа для шифрования и цифровой подписи сообщений и файлов, разработанная Филипом Циммерманом в 1991 году. В 1997 году появился открытый стандарт OpenPGP.
GPG (GnuPG, GNU Privacy Guard) — свободная альтернатива PGP под лицензией GNU GPL, полностью совместимая с OpenPGP. На практике вы почти всегда работаете именно с ней.
Логика подписи проста. Разработчик создаёт пару ключей: приватным подписывает выпуск, публичный публикует на серверах ключей. Любой может взять публичный ключ и убедиться, что подпись принадлежит владельцу приватного.
Подписывается не программа, а список хешей
Ключевая деталь, из-за которой процедура поначалу кажется запутанной: подписывают обычно не сам бинарник, а текстовый файл с контрольными суммами.
Схема такая. Разработчик считает хеш каждого архива (обычно SHA-256), складывает их в файл SHA256SUMS и подписывает уже этот файл. Подпись кладётся рядом отдельным файлом SHA256SUMS.asc или .sig.
Для проверки нужны три файла:
- сам файл программы;
- подписанный файл с контрольными суммами;
- файл подписи.
Проверка распадается на два независимых шага, и оба обязательны:
- подпись доказывает, что список хешей выпустил тот, кого вы ожидаете;
- сравнение хеша доказывает, что скачанный вами бинарник — тот самый, который в этом списке.
Пропустите второй шаг — и вы проверили подлинность списка, но не файла. Пропустите первый — сверили файл со списком, который мог подсунуть кто угодно.
Иногда встречается и прямая подпись бинарника: например, у Electrum файл .asc подписывает сам AppImage. Тогда шагов остаётся два.
Проверка в консоли
Установите GPG (gpg --version покажет, что он уже есть). Если предпочитаете графический интерфейс, в исходном материале подробно разобран GpgFrontend — кроссплатформенный, с проверкой в пару кликов.
Шаг 1. Импортировать ключи разработчиков. Без публичного ключа проверить подпись нечем:
gpg --recv-keys <отпечаток>Если сервер по умолчанию недоступен, укажите другой:
gpg --keyserver keyserver.ubuntu.com --recv-keys <отпечаток>Шаг 2. Проверить подпись:
gpg --verify <файл подписи> <проверяемый файл>Для отсоединённой подписи файла с суммами достаточно одного аргумента — GPG сам найдёт парный файл:
gpg --verify SHA256SUMS.ascШаг 3. Посчитать хеш и сравнить его со значением из SHA256SUMS:
sha256sum bitcoin-28.0-x86_64-linux-gnu.tar.gzНа macOS та же операция делается через shasum -a 256 <файл>, где -a 256 задаёт алгоритм. Для SHA-512 — -a 512, есть также sha512sum и md5sum.
Чего проверка сама по себе не доказывает
Самая частая ошибка — принять «подпись верна» за окончательный ответ. Проверка подтверждает, что файл подписан ключом с определённым отпечатком. Она не подтверждает, что этот ключ принадлежит нужному человеку.
Отпечатки ключей разработчиков нужно сверять с независимыми источниками, а не с той же страницей, откуда вы скачали дистрибутив. Для этого же существует сеть доверия (Web of Trust): вы можете отметить проверенный ключ как доверенный командой
gpg --edit-key <отпечаток> trustПока ключ не подписан вами и не связан с сетью доверия, GPG будет выводить предупреждение о том, что подпись не заверена доверенной подписью, — это нормальное поведение, а не признак подделки.
Воспроизводимые сборки
Подпись и контрольная сумма закрывают вопрос «получил ли я то, что выложил разработчик». Открытым остаётся другой: соответствует ли выложенный бинарник тому исходному коду, который вы можете прочитать?
Между исходниками и бинарником стоит компилятор, набор библиотек и вся цепочка инструментов. Скомпрометированная где-то в этой цепочке сборка даст корректно подписанный файл с корректной контрольной суммой — и при этом другой код.
Bitcoin Core отвечает на это загружаемыми (bootstrappable) сборками на основе Guix. Формулировка из документации проекта: подход усиливает гарантии безопасности бинарников, позволяя проверять и воспроизводить цепочку инструментов вместо слепого доверия скачанным бинарникам.
Как это устроено
Сборка побитово детерминирована: из одних и тех же исходников на любой машине должен получиться байт в байт одинаковый бинарник. Ради этого фиксируется даже время — переменная SOURCE_DATE_EPOCH задаёт эталонную отметку времени, используемую для побитовой воспроизводимости.
Дальше работает коллективная проверка:
- Независимые сборщики собирают релиз у себя командой
./contrib/guix/guix-build. - Каждый считает контрольные суммы полученных файлов — они собираются в
SHA256SUMS. - Каждый аттестует результат: подписывает свои суммы GPG-ключом и отправляет подпись в отдельный публичный репозиторий
guix.sigs. Механика та же, что раньше применялась вgitian.sigs. - Каждый может проверить чужие аттестации против своей:
guix-verifyсравнивает подписи других сборщиков с собственным результатом.
Публикация релиза наступает только после того, как шесть или более человек собрали проект и их результаты совпали. Подписи всех сборщиков объединяются в один файл SHA256SUMS.asc, который и выкладывается рядом с бинарниками.
Отдельная тонкость с macOS и Windows: эти платформы требуют подписи кода производителя, поэтому у них появляются два набора сумм — noncodesigned.SHA256SUMS до подписания и all.SHA256SUMS после.
Что это даёт вам
Проверяя SHA256SUMS.asc, вы фактически опираетесь не на одну подпись, а на согласие независимых сборщиков, каждый из которых воспроизвёл бинарник у себя. Чтобы подсунуть вам вредоносный релиз, атакующему пришлось бы скомпрометировать не одного разработчика, а кворум.
Собирать самому при этом необязательно — но принципиально важно, что такая возможность есть и ею регулярно пользуются. Для самостоятельной сборки нужно около 16 ГБ на разделе с /gnu/store и ещё около 8 ГБ на каждую целевую платформу.
У Guix есть и собственная развилка доверия. Субституты — заранее собранные пакеты, скачиваемые с серверов сборки, — экономят часы времени, но возвращают часть доверия обратно. Отказ от них (--no-substitutes) означает сборку всего с нуля: первый прогон долгий, зато результат ни от кого не зависит.
Практический порядок действий
- Скачайте файл программы, файл
SHA256SUMSи подписьSHA256SUMS.asc. - Импортируйте публичные ключи разработчиков и сверьте отпечатки с независимым источником.
- Проверьте подпись:
gpg --verify SHA256SUMS.asc. - Посчитайте хеш скачанного файла и найдите его в
SHA256SUMS. - Только после этого запускайте установку.
Отдельно стоит подчеркнуть один случай. Инструмент, которым вы создаёте ключ — офлайн-генератор сид-фразы, прошивка аппаратного кошелька, — проверять нужно тем более тщательно: это ровно та вещь, которую злоумышленнику интереснее всего подменить. Проверять её следует до переноса на офлайн-машину, пока у вас ещё есть доступ к сети и к независимым источникам отпечатков.
Пробелы
Использованные источники описывают процедуру со стороны сборщика и релиз-менеджера Bitcoin Core. Не разобран инструмент contrib/verify-binaries, которым проверку можно выполнить одной командой, и не рассмотрено, как обстоят дела с воспроизводимостью у прошивок аппаратных кошельков — там практика заметно неоднороднее.
Источники
- Проверка подлинности программного обеспечения с помощью PGP
- Bootstrappable Bitcoin Core Builds (MIT)
- Bitcoin Core Release Process (MIT)